2013-08-13 3 views
1

Comment écrire des tests rspec de façon défensive, de sorte que dans un scénario au moins une attente doit être satisfaite et que l'échec des autres est accepté? (sans changement d'entrée). AND est assez facile par listing multiple expectations, mais comment est exprimé OR?rspec attend condition ou condition

À titre d'exemple, un utilisateur a de nombreux messages, et l'utilisateur Bob hacks un formulaire afin que quand il soumet son formulaire de création poste, il envoie l'identifiant de l'utilisateur Dunc. Actuellement l'application ignore le passé id et utilise id de Bob comme Bob est la création de la publication. Nous pouvons donc tester que le poste nouvellement créé a Bob 's user_id. Toutefois, si à l'avenir le code est refactorisé pour qu'il renvoie un message d'erreur au lieu de supposer id de Bob, ce test échouerait à tort. Je veux tester l'intention, pas la mise en œuvre.

i besoin donc de tester que soit aucun poste est créé, ou que si l'on est créé, son pour Bob.

Cet exemple est si simple qu'il peut être résolu en testant

expect { run }.not_to change(Post.where(user_id: @other_user.id), :count) 

Cependant, je suis à la recherche de la solution générale, dans les cas plus complexes, il peut y avoir beaucoup de conditions. Comment "OU" est-il réalisé dans Rspec? (ou n'est-ce pas possible?)

Répondre

4

Je ne pense pas que ce soit possible.

Je pense que vous vous trompez quand vous dites que vous testeriez la mise en œuvre, au lieu de l'intention dans votre exemple. Lorsque vous écrivez un test, vous testez si ce qui sort répond à vos attentes.

La création d'un utilisateur est quelque chose de complètement différent du renvoi de messages d'erreur. À mon avis, il serait étrange de dire: quand je fais cela, je m'attends à ceci ou cela ou cela. À mon avis, vous devriez écrire un test, qui teste si un utilisateur est créé lorsque vous envoyez les bons paramètres, et un autre test qui traite de ce qui se passe quand un utilisateur essaie d'envoyer des paramètres illégaux.