2008-10-28 3 views
26

Dans mon contrôleur Rails, je crée plusieurs instances de la même classe de modèle. Je veux ajouter quelques attentes RSpec afin que je puisse tester qu'il crée le bon nombre avec les paramètres corrects. Alors, voici ce que j'ai dans mon spec:Comment ajouter plusieurs attentes should_receive sur un objet en utilisant RSpec?

 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => @user.id, :position_id => 1, :is_leader => true) 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "2222", :position_id => 2) 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "3333", :position_id => 3) 
Bandmate.should_receive(:create).with(:band_id => @band.id, :user_id => "4444", :position_id => 4) 

Cela est à l'origine des problèmes, car il semble que la classe Bandmate ne peut avoir 1 « should_receive » attente fixé sur elle. Alors, quand je lance l'exemple, je reçois l'erreur suivante:

 
Spec::Mocks::MockExpectationError in 'BandsController should create all the bandmates when created' 
Mock 'Class' expected :create with ({:band_id=>1014, :user_id=>999, :position_id=>1, :is_leader=>true}) but received it with ({:band_id=>1014, :user_id=>"2222", :position_id=>"2"}) 

Ce sont les paramètres corrects pour le deuxième appel à créer, mais RSpec est contre les tests des paramètres erronés.

Est-ce que quelqu'un sait comment je peux configurer mes attentes should_receive pour permettre plusieurs appels différents?

+0

Cela devrait fonctionner. Quelle version de RSpec utilisez-vous? Essayez d'appeler les méthodes stubed en séquence à partir de la spécification (Bandmate.create (...: user_id => @ user.id ...); Bandmate.create (...: user_id => "2222" ...); ...) et voir si cela fonctionne. –

Répondre

34

Les attentes multiples ne sont pas un problème du tout. Ce que vous rencontrez sont des problèmes de commande, compte tenu de vos arguments spécifiques sur les attentes non ordonnées. Vérifiez this page pour plus de détails sur les attentes de commande.

La nouvelle est que vous devez ajouter .ordered à la fin de chacune de vos attentes.

+0

Huh, ça marche maintenant même sans .ordered Je suppose que j'ai eu une erreur dans mon code et je l'ai blâmé sur RSpec. Merci pour le pourboire! – Micah

+0

le lien est 404 sur github – xxjjnn

+0

L'ancienne page a 404. Je crois que c'est celui-ci maintenant: http://rspec.info/documentation/3.3/rspec-mocks/#Ordering – AmitA

-1

Mock Receive Counts

my_mock.should_receive (: sym) .Une fois
my_mock.should_receive (: sym) .twice
my_mock.should_receive (: sym) .exactly (n) .times
my_mock.should_receive (: sym) .at_least (: une fois)
my_mock.should_receive (: sym) .at_least (: deux fois)
my_mock.should_receive (: sym) .at_least (n) .times
my_mock.should_receive (: sym) .at_most (: une fois)
my_m ock.should_receive (: sym) .at_most (: deux fois)
my_mock.should_receive (: sym) .at_most (n) .times
my_mock.should_receive (: sym) .any_number_of_times

Works pour rspec 2,5 aussi.

+14

ne couvre pas les différents arguments qui doivent être reçus pour chaque appel. – sevenseacat

+1

comment le faites-vous avec différents args? –

Questions connexes