Jak powiedzieć „powinien_odebrać” więcej razy w RSpec

112

Mam to w swoim teście

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

ale kiedy obiekt otrzyma wywołanie tej metody dwa razy, muszę to zrobić

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

Czy jest jakiś sposób, jak powiedzieć coś takiego

Project.should_receive(:find).with(@project).and_return(@project).times(2)
Jakub Arnold
źródło

Odpowiedzi:

214

To jest nieaktualne. Sprawdź odpowiedź Uri poniżej

2 razy:

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

dokładnie n razy:

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

co najmniej n razy:

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

więcej szczegółów na https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts w sekcji Liczby odbioru

Mam nadzieję, że to pomoże =)

Staelen
źródło
3
Wydaje się, że może to nie działa any_instance?
Jared Beck
@YoLudke I don't know
Jared Beck
2
Powinien używać nowej składni wymienionej w odpowiedzi Uri .
theblang
61

Nowa expectskładnia rspec będzie wyglądać następująco:

2 razy:

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

dokładnie n razy:

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

co najmniej n razy:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)
Uri Agassi
źródło
1
have_receivedSkładnia działa również. expect(Project).to have_received(:find).exactly(n).timesitd.
David Tuite,
0

@JaredBeck wskazał. Rozwiązanie nie zadziałało dla mnie na any_instancewezwanie.

W każdym razie skończyło się na używaniu stub zamiast should_receive.

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

To zadziała dla każdego nie. jednak razy.

Prasanna
źródło
0

should_receive, w przeciwieństwie do any_instance, oczekuje, że klasa otrzyma wiadomość określoną liczbę razy.

any_instance z drugiej strony jest zwykle używany do odgrywania metody.

Tak więc pierwszy przypadek to oczekiwanie, które chcielibyśmy przetestować, podczas gdy drugi to przejście metody do następnej linii, abyśmy mogli przejść dalej.

amnsan
źródło
1
Drenmi Doceniam czas poświęcony na dodanie kilku przecinków do wpisu, który dodałem prawie rok temu ... Wyglądało na to, że nie nastąpiła żadna zmiana w technicznym aspekcie odpowiedzi ... Dlaczego głosowałeś w dół mnie za to ...?
amnsan