Come si dice "should_receive" più volte in RSpec


112

Ho questo nel mio test

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

ma quando l'oggetto riceve quella chiamata al metodo due volte, devo farlo

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

C'è un modo per dire qualcosa di simile

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

Risposte:


214

Questo è obsoleto. Si prega di controllare la risposta di Uri di seguito

per 2 volte:

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

per esattamente n volte:

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

per almeno n volte:

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

maggiori dettagli su https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts sotto Receive Counts

Spero che aiuti =)


3
Sembra che forse questo non funziona con any_instance?
Jared Beck

@YoLudke Non lo so
Jared Beck

2
Dovrebbe usare la nuova sintassi menzionata nella risposta di Uri .
theblang

61

La nuova expectsintassi di rspec sarà simile a questa:

per 2 volte:

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

per esattamente n volte:

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

per almeno n volte:

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

1
Anche la have_receivedsintassi funziona. expect(Project).to have_received(:find).exactly(n).timesecc.
David Tuite

0

@JaredBeck ha sottolineato. La soluzione non ha funzionato per me su any_instancechiamata.

Per ogni istanza ho finito per usare stub invece di should_receive.

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

Questo funzionerà per qualsiasi no. di volte però.



0

should_receive, al contrario di any_instance, si aspetta che la classe riceva il messaggio il numero di volte specificato.

any_instance d'altra parte è generalmente utilizzato per lo stubbing di un metodo.

Quindi il primo caso è un'aspettativa che vorremmo testare, mentre il secondo è far passare un metodo alla riga successiva in modo da poter andare avanti.


1
Drenmi Apprezzo il tempo che hai impiegato per aggiungere alcune virgole a un post che avevo aggiunto quasi un anno fa ... Non sembrava ci fosse alcuna modifica all'aspetto tecnico della risposta ... Perché dovresti votare contro io per questo ...?
amnsan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.