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