Comment dire “any_instance” “should_receive” un certain nombre de fois dans RSpec
J'ai une importation de contrôleur dans les rails que les importations de plusieurs fichiers csv avec plusieurs enregistrements dans ma base de données. Je voudrais tester dans RSpec si les enregistrements sont effectivement enregistrées à l'aide de RSpec:
<Model>.any_instance.should_receive(:save).at_least(:once)
Cependant, je reçois le message d'erreur disant:
The message 'save' was received by <model instance> but has already been received by <another model instance>
Un exemple artificiel du contrôleur:
rows = CSV.parse(uploaded_file.tempfile, col_sep: "|")
ActiveRecord::Base.transaction do
rows.each do |row|
mutation = Mutation.new
row.each_with_index do |value, index|
Mutation.send("#{attribute_order[index]}=", value)
end
mutation.save
end
Est-il possible de tester cette aide RSpec ou est-il une solution de contournement?
- Quelle est la version de RSpec utilisez-vous et quel est le message d'erreur que vous voyez?
- rspec (2.8.0) et le message est le suivant: Le message "enregistrer" a été reçu par <instance du modèle> mais il a déjà été reçu par <une autre instance du modèle>
- C'est le comportement attendu. Le point de any_instance est pas de savoir quelle instance unique est à attendre quelque chose, mais c'est encore limite à une seule instance.
- C'est le comportement attendu - acquis - mais il n'est pas très utile si vous souhaitez tester cette. Et il ne semble pas être une autre méthode, comme "many_instances" qui relaxe la contrainte d'une instance.
Vous devez vous connecter pour publier un commentaire.
Il y a une nouvelle syntaxe pour que cela:
expect_any_instance_of
. Voici un lien vers la doc.Voici une meilleure réponse qui évite d'avoir à remplacer l' :nouvelle méthode:
Semble que le talon de la méthode peut être attaché à n'importe quelle instance w/o la contrainte, et de le faire bloc peut faire un compte que vous pouvez vérifier pour affirmer qu'il a été appelé le bon nombre de fois.
Mise à jour - nouvelle rspec version requiert la syntaxe suivante:
J'ai enfin réussi à faire un test qui fonctionne pour moi:
Le stub méthode retourne une instance unique qui reçoit la méthode enregistrer plusieurs fois. Parce que c'est une instance unique je peux laisser le
any_instance
méthode et l'utilisation de laat_least
méthode normalement.Stub comme ce
Puis attendre comme ceci:
C'est une simplification de ce gist, à utiliser
any_instance
, puisque vous n'avez pas besoin de proxy à la méthode d'origine. Reportez-vous à qui gist pour d'autres utilisations.allow
etallow_any_instance_of
au lieu destub
etany_instance.stub
puisque les anciens sont désormais obsolète (voir: github.com/rspec/...)C'est Rob exemple à l'aide de RSpec 3.3, qui ne prend plus en charge
Foo.any_instance
. J'ai trouvé ce utile lorsque dans une boucle de la création d'objetsMon cas est un peu différent, mais je l'ai retrouvé à cette question pensé à abandonner ma réponse ici aussi. Dans mon cas, je voulais stub n'importe quelle instance d'une classe donnée. J'ai eu le même message d'erreur lorsque je l'ai utilisé
expect_any_instance_of(Model).to
. Quand je l'ai changé pourallow_any_instance_of(Model).to
, mon problème a été résolu.Consultez la documentation pour plus d'arrière-plan: https://github.com/rspec/rspec-mocks#settings-mocks-or-stubs-on-any-instance-of-a-class
Vous pouvez essayer de compter le nombre de
new
sur la classe. Ce n'est pas fait de tests, le nombre desave
s, mais peut être assezSi il est le seul espoir de combien de fois il a été enregistré. Ensuite, vous voudrez probablement utiliser
spy()
au lieu de entièrement le fonctionnement de l'usine, comme dansHarm de Wit
propre réponse