我有一些代码,非常简化后,看起来像这样:
class B
def initialize opts
@opts = opts
end
end
class A
def initialize opts
# defaults etc applied to opts
@b = B.new opts
end
end
换句话说,在我使用选项初始化A时,它会创建一个B并将修改后的选项传递给它。
我想测试B.new是否得到了正确的参数。目前,我是这样做的,使用RSpec/RR:
@b = Object.new
# stub methods on @b here
stub(B).new { |options|
options[:foo].should == 'whatever'
@b
}
A.new({:foo => 'whatever'})
但是这有两个问题。
首先,我无法使用实际选项来实例化
B
的实际副本。如果我在块内调用 B.new,它会调用存根版本并循环直到堆栈弹出。我可以在存根之前设置 @b = B.new
,但我不知道将传递哪些选项,这使测试失去了意义。(在某人指责我的时候:是的,在严格的单元测试教条中,对 A 的测试应该存根掉 B 中的任何方法,并且需要存根很多意味着你的代码本身就是有问题的。)
其次,把
should
放在测试的设置中,而不是在单独的 it ... do ... end
块中,感觉就是错误的。但是由于我无法创建一个实际的 B
(参见上文),因此我也无法真正询问它的后构建状态。有什么想法吗?