gpt4 book ai didi

ruby - Rspec 的 `should_receive` 是否有侵入性较小的替代方案?

转载 作者:数据小太阳 更新时间:2023-10-29 06:22:44 27 4
gpt4 key购买 nike

在编写 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) 会验证方法调用并将其传递给原始方法。如果我想 stub 它的行为以便更好的隔离测试,我会明确地这样做:@baker.stub(:make_batter).and_return(@batter)

有没有办法在不阻止原始方法调用的情况下执行类似 should_receive 的操作?我的问题是糟糕设计的征兆吗?

最佳答案

看起来更好的 API 可以委托(delegate)给 Myron Marston 提到的原始方法,实际上已经添加到 rspec-mocks v2.12.0 中了。

所以现在您可以在任何时候“想要设置消息期望而不干扰对象如何响应消息”时简单地执行此操作:

@baker.should_receive(:make_batter).and_call_original

感谢您添加这个,Myron。

关于ruby - Rspec 的 `should_receive` 是否有侵入性较小的替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159536/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com