如何在 RSpec 中多说几次“should_receive”

问题描述 投票:0回答:4

我的测试中有这个

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)
ruby-on-rails rspec
4个回答
237
投票

这已经过时了。请检查下面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://rspec.info/documentation/3.5/rspec-mocks/RSpec/Mocks/MessageExpectation.html下的约束接收计数


98
投票

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)

0
投票

should_receive
,与
any_instance
相反,期望类接收指定次数的消息。

另一方面,

any_instance
通常用于存根方法。

因此,第一个情况是我们想要测试的期望,而第二个情况是通过方法到达下一行,以便我们可以继续。


0
投票

@JaredBeck 指出。该解决方案在

any_instance
通话中对我不起作用。

对于任何实例,我最终都使用存根而不是 should_receive。

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

这适用于任何号码。虽然有很多次。

更新: 语法已弃用。看评论。

© www.soinside.com 2019 - 2024. All rights reserved.