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)

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 =)


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)

1
have_receivedSkładnia działa również. expect(Project).to have_received(:find).exactly(n).timesitd.
David Tuite,


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.