2009-08-25 2 views
100

ho questo nel mio testCome dire "should_receive" più volte in RSpec

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

ma quando oggetto riceve quel metodo di chiamata due volte, devo fare

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

C'è qualche modo come dire qualcosa come

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

risposta

209

Questo è obsoleto. Si prega di verificare la risposta di Uri sotto

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 Ricevi conteggi

Speranza che aiuta =)

+3

Sembra che forse questo non funziona con 'any_instance'? –

+0

@ JaredBeck perché? –

+0

@YoLudke Non so –

0

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

any_instance d'altra parte viene generalmente utilizzato per lo stubing di un metodo.

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

+1

Drenmi, apprezzo il tempo che hai impiegato per aggiungere un paio di virgola a un post che avevo aggiunto quasi un anno fa ... Non sembrava che ci fosse qualche cambiamento nell'aspetto tecnico della risposta ... Perché dovresti votarmi per questo ...? – amnsan

38

La nuova expect sintassi del 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 sintassi 'have_received' funziona. 'expect (Project) .to have_received (: find) .exactly (n) .times' etc. –

0

@JaredBeck ha sottolineato. La soluzione non ha funzionato per me sulla chiamata any_instance.

Per ogni istanza ho finito per utilizzare lo stub anziché should_receive.

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

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

+0

http://stackoverflow.com/questions/24595203/rspec-any-instance-deprecation-how-to-fix-it –