Comment dire "devrait_recevoir" plus de fois dans RSpec

112

J'ai ça dans mon test

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

mais quand l'objet reçoit cet appel de méthode deux fois, je dois faire

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

Y a-t-il un moyen de dire quelque chose comme

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

Réponses:

214

C'est obsolète. Veuillez vérifier la réponse d'Uri ci-dessous

pour 2 fois:

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

pour exactement n fois:

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

pendant au moins n fois:

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

plus de détails sur https://www.relishapp.com/rspec/rspec-mocks/v/2-13/docs/message-expectations/receive-counts sous Recevoir les comptes

J'espère que ça aide =)

Staelen
la source
3
On dirait que peut-être que cela ne fonctionne pas avec any_instance?
Jared Beck
@YoLudke je ne sais pas
Jared Beck
2
Devrait utiliser la nouvelle syntaxe mentionnée dans la réponse d'Uri .
theblang
61

La nouvelle expectsyntaxe de rspec ressemblera à ceci:

pour 2 fois:

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

pour exactement n fois:

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

pendant au moins n fois:

expect(Project).to receive(:msg).at_least(n).times.with(@project).and_return(@project)
Uri Agassi
la source
1
La have_receivedsyntaxe fonctionne également. expect(Project).to have_received(:find).exactly(n).timesetc.
David Tuite
0

A souligné @JaredBeck. La solution n'a pas fonctionné pour moi sur any_instanceappel.

Dans tous les cas, j'ai fini par utiliser stub au lieu de should_receive.

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

Cela fonctionnera pour tout non. des fois cependant.

Prasanna
la source
0

should_receive, par opposition à any_instance, s'attend à ce que la classe reçoive le message le nombre de fois spécifié.

any_instance d'autre part, est généralement utilisé pour le stubbing d'une méthode.

Ainsi, le premier cas est une attente que nous aimerions tester, tandis que le second passe d'une méthode à la ligne suivante afin que nous puissions passer à autre chose.

Amnsan
la source
1
Drenmi J'apprécie le temps que vous avez pris pour ajouter quelques virgules à un message que j'avais ajouté il y a presque un an ... Il ne semblait pas qu'il y ait eu de changement dans l'aspect technique de la réponse ... Pourquoi voteriez-vous contre moi pour ça ...?
amnsan