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.