我遇到了这种情况,在这种情况下,我定义了一个实例方法,该方法返回类本身的“安全篡改”测试虚拟对象。

require 'test/unit'
require 'shoulda'

module TestExtension
  def provides_tested_class_dummy
    self.class_exec do
      def tested_class_dummy
        txt = "class #{@tested_class.name}Dummy < #{@tested_class.name}; end"
        sub = self.singleton_class.class_eval txt
        duplicated = sub.dup
        duplicated.class_exec do
          # do evil things to the dummy,
          # such as redefining constants and stubbing methods
        end
      end
    end
  end
end

Test::Unit::TestCase.extend TestExtensions

请不要笑。我这样做是因为它对我需要做的事情起作用,也就是说,在不接触被测试的类的情况下,测试类并对它们的虚拟对象做坏事。
class SomeClass
  # define some constants
  # define some methods
end

然后,测试它:
class SomeClassTest < Test::Unit::TestCase
  @tested_class = ::SomeClass
  provides_tested_class_dummy()

  should "somehow comply" do
    dummy = tested_class_dummy()
    assert_kind_of Module, dummy
    # other assertions about the dummy's behavior
  end
end

现在你可以开始笑了。
我的主要问题是,在“duplicated=sub.dup”行中,我复制了子类测试类,这行有什么意义吗?在我看来,这是伏都教,我这样做只是为了尽量减少对测试类本身的虚拟对象所做的篡改的任何负面影响。我在一节课上作弊有什么收获吗?
旁白:如果我在做一件可笑的事,请告诉我。我简化了这段代码,但我不确定它是如何工作的(更复杂的原始代码确实能按我的预期工作),但我希望你至少能得到这个想法。另外,请,那里的巫师,推荐我一个好的模拟框架。

最佳答案

如果您想在不践踏原始类的情况下更改常量或其他类范围的数据,那么复制它看起来是一种方法-

class Lion
  ROAR = 'roar!'
end

L2 = Lion.dup

puts Lion::ROAR             # "roar!"
puts Lion::ROAR.object_id   # 2152285120

puts L2::ROAR               # "roar!"
puts L2::ROAR.object_id     # 2152285120

L2::ROAR = 'rawrrr'

puts Lion::ROAR             # "roar!"
puts Lion::ROAR.object_id   # 2152285120

puts L2::ROAR               # "rawrrr"
puts L2::ROAR.object_id     # 2152285000

关于ruby - 复制Ruby类有什么用吗? (我正在做粗嘲。),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10476348/

10-11 10:25