ChatGPT解决这个技术问题 Extra ChatGPT

如何在 RSpec 中多次说“should_receive”

我的测试中有这个

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)

C
Community

这是过时的。请在下面查看 Uri 的答案

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-counts 中的更多详细信息

希望它有帮助=)


似乎这可能不适用于 any_instance
@YoLudke 我不知道
应使用 Uri's answer 中提到的新语法。
U
Uri Agassi

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 等。
P
Prasanna

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

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

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

这将适用于任何否。不过。


D
Drenmi

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

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

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


Drenmi 我很感激您花时间在我几乎一年前添加的帖子中添加几个逗号...看起来答案的技术方面没有任何变化...您为什么不投票我为了这个……?