Wie man in RSpec öfter "should_receive" sagt

112

Ich habe das in meinem Test

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

Aber wenn das Objekt diesen Methodenaufruf zweimal empfängt, muss ich das tun

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

Gibt es eine Möglichkeit, so etwas zu sagen?

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

Antworten:

214

Das ist veraltet. Bitte überprüfen Sie Uris Antwort unten

für 2 mal:

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

für genau n mal:

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

für mindestens n mal:

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

Weitere Informationen finden Sie unter https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts unter Receive Counts

Hoffe es hilft =)

Staelen
quelle
3
Scheint, als ob das vielleicht nicht funktioniert any_instance?
Jared Beck
@ YoLudke Ich weiß nicht
Jared Beck
2
Sollte die neue Syntax verwenden, die in Uris Antwort erwähnt wird .
Theblang
61

Die neue expectSyntax von rspec sieht folgendermaßen aus:

für 2 mal:

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

für genau n mal:

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

für mindestens n mal:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)
Uri Agassi
quelle
1
Die have_receivedSyntax funktioniert auch. expect(Project).to have_received(:find).exactly(n).timesusw.
David Tuite
0

@ JaredBeck wies darauf hin. Die Lösung hat bei mir auf any_instanceAbruf nicht funktioniert .

Für jeden Fall habe ich stub anstelle von should_receive verwendet.

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

Dies funktioniert für alle Nr. von Zeiten aber.

Prasanna
quelle
0

should_receiveany_instanceerwartet im Gegensatz zu , dass die Klasse die angegebene Anzahl von Malen empfängt.

any_instance Andererseits wird im Allgemeinen zum Stubben eines Verfahrens verwendet.

Der erste Fall ist also eine Erwartung, die wir testen möchten, während der zweite eine Methode hinter sich lässt und zur nächsten Zeile übergeht, damit wir weitermachen können.

Amnsan
quelle
1
Drenmi Ich schätze die Zeit, die Sie gebraucht haben, um ein paar Kommas zu einem Beitrag hinzuzufügen, den ich vor fast einem Jahr hinzugefügt hatte ... Es sah nicht so aus, als hätte sich der technische Aspekt der Antwort geändert ... Warum sollten Sie abstimmen? ich dafür ...?
Amnsan