如何在 RSpec 中多次说“should_receive”

Posted

技术标签:

【中文标题】如何在 RSpec 中多次说“should_receive”【英文标题】:How to say "should_receive" more times in RSpec 【发布时间】:2010-11-22 15:10:21 【问题描述】:

我的测试中有这个

Project.should_receive(:find).with(@project).and_return(@project)

但是当对象收到两次该方法调用时,我必须这样做

Project.should_receive(:find).with(@project).and_return(@project)
Project.should_receive(:find).with(@project).and_return(@project)

有什么办法可以说

Project.should_receive(:find).with(@project).and_return(@project).times(2)

【问题讨论】:

【参考方案1】:

这是过时的。请查看下方Uri's answer

2次:

Project.should_receive(:find).twice.with(@project).and_return(@project)

正好 n 次:

Project.should_receive(:find).exactly(n).times.with(@project).and_return(@project)

至少 n 次:

Project.should_receive(:msg).at_least(n).times.with(@project).and_return(@project)

https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-countshttps://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts接收计数

下的更多详细信息

希望对你有帮助 =)

【讨论】:

似乎这不适用于any_instance @YoLudke 我不知道 应该使用Uri's answer中提到的新语法。【参考方案2】:

rspec 的新 expect 语法如下所示:

2次:

expect(Project).to receive(:find).twice.with(@project).and_return(@project)

正好 n 次:

expect(Project).to receive(:find).exactly(n).times.with(@project).and_return(@project)

至少 n 次:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)

【讨论】:

have_received 语法也有效。 expect(Project).to have_received(:find).exactly(n).times【参考方案3】:

@JaredBeck 指出。该解决方案在 any_instance 通话中对我不起作用。

对于任何情况,我最终都使用 stub 而不是 should_receive。

Project.any_instance.stub(:some_method).and_return("value")

这适用于任何否。不过。

【讨论】:

***.com/questions/24595203/…【参考方案4】:

should_receiveany_instance 不同,期望类接收指定次数的消息。

另一方面,any_instance 通常用于存根方法。

所以第一种情况是我们想要测试的期望,而第二种情况是通过一个方法到下一行,以便我们继续前进。

【讨论】:

Drenmi 感谢您花时间在我将近一年前添加的帖子中添加几个逗号...看起来答案的技术方面没有任何变化...你为什么要对我投反对票...?

以上是关于如何在 RSpec 中多次说“should_receive”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 rspec 测试 mandrill api

如何在 rspec 中运行单个测试?

Rspec中describe和context不同

如何在 Rails/RSpec 中测试异常引发?

如何使用rails cucumber,rspec,capybara在视图(dhtml)中测试动态部分?

如何在Rspec中测试文件大小