【发布时间】:2012-07-06 13:14:57
【问题描述】:
所以我有一些代码,非常简化,看起来像这样:
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 的测试应该 stub B 中的任何方法,并且需要大量存根意味着你的代码一开始就不好。)
其次,将should 放在测试的设置中感觉不对,而不是之后单独的it ... do ... end 块。但由于我无法创建实际的B(见上文),我也无法真正询问其构建后的状态。
有什么想法吗?
【问题讨论】:
标签: ruby constructor rspec stubbing rr