How to say "should_receive" more times in RSpec

Ruby on-RailsRspec

Ruby on-Rails Problem Overview


I have this in my test

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

but when object receive that method call two times, I have to do

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

Is there any way how to say something like

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

Ruby on-Rails Solutions


Solution 1 - Ruby on-Rails

This is outdated. Please check Uri's answer below

for 2 times:

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

for exactly n times:

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

for at least n times:

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

more details at https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts under Receive Counts

Hope it helps =)

Solution 2 - Ruby on-Rails

The new expect syntax of rspec will look like this:

for 2 times:

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

for exactly n times:

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

for at least n times:

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

Solution 3 - Ruby on-Rails

should_receive, as opposed to any_instance, expects that the class receives message the specified number of times.

any_instance on the other hand is generally used for stubbing a method.

So the first case is an expectation that we would like to test, while the second one is getting past a method to the next line so we can move on.

Solution 4 - Ruby on-Rails

@JaredBeck pointed out. The solution didn't work for me on any_instance call.

For any instance i ended up using stub instead of should_receive.

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

This will work for any no. of times though.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJakub ArnoldView Question on Stackoverflow
Solution 1 - Ruby on-RailsStaelenView Answer on Stackoverflow
Solution 2 - Ruby on-RailsUri AgassiView Answer on Stackoverflow
Solution 3 - Ruby on-RailsamnsanView Answer on Stackoverflow
Solution 4 - Ruby on-RailsPrasannaView Answer on Stackoverflow