在编写 Rspec 测试时,我经常对should_receive
. 我想知道是否有不那么侵入性的选择。
例如:
describe "making a cake" do
it "should use some other methods" do
@baker.should_receive(:make_batter)
@baker.make_cake
end
end
调用should_receive
是一个很好的描述,但它破坏了我的代码,因为should_receive
通过屏蔽原始方法来工作,并且除非实际返回一些击球手make_cake
,否则无法继续。make_batter
所以我把它改成这样:
@baker.should_receive(:make_batter).and_return(@batter)
这很丑,因为:
- 看起来我正在测试
make_batter
是否正确返回,但实际上@batter
我是在强制伪造版本的返回。make_batter
- 它迫使我单独设置
@batter
- 如果
make_batter
有任何重要的副作用(我想可能是代码味道),我也必须让这些发生。
我希望这should_receive(:make_batter)
将验证方法调用并将其传递给原始方法。如果我想存根它的行为以进行更好的隔离测试,我会明确地这样做:@baker.stub(:make_batter).and_return(@batter)
.
should_receive
有没有办法在不阻止原始方法调用的情况下做类似的事情?我的问题是糟糕设计的征兆吗?