Comment voulez-vous tester les observateurs avec rSpec en Ruby on Rails application?
Supposons que vous avez un ActiveRecord::Observateur dans l'une de vos Ruby on Rails applications - comment pouvez-vous tester cet observateur avec rSpec?
Vous devez vous connecter pour publier un commentaire.
Vous êtes sur la bonne voie, mais j'ai couru dans un certain nombre de frustrant inattendu message d'erreurs lors de l'utilisation de rSpec, les observateurs et les objets fantaisie. Quand je suis spec de tester mon modèle, je ne veux pas avoir à gérer observateur comportement dans mon message attentes.
Dans votre exemple, il n'y a pas une très bonne façon de spec "set_status" sur le modèle sans la connaissance de ce que l'observateur va faire pour elle.
Par conséquent, je tiens à utiliser le "Pas de Peeping Toms" plugin. Donné votre code ci-dessus et en utilisant le Pas de Peeping Toms plugin, je voudrais spec le modèle comme ceci:
Vous pouvez spec votre modèle de code sans avoir à se soucier qu'il y a un observateur qui va venir dans et tabasser votre valeur. Vous auriez spec séparément dans le person_observer_spec comme ceci:
Si vous avez VRAIMENT VRAIMENT envie de tester le Modèle couplé et Observateur de la classe, vous pouvez le faire comme ceci:
99% du temps, je préfère spec test avec les observateurs éteint. C'est juste plus facile de cette façon.
describe PersonObserver { around(:each) { |spec| Person.with_observers(:person_observer) { spec.run } } }
Cela permet à l'observateur de tous les tests à l'intérieur de la PersonObserver décrire bloc.Avertissement: je ne l'ai jamais fait ça sur un site de production, mais il semble que, d'une manière raisonnable serait d'utiliser les objets fantaisie,
should_receive
et les amis, et appeler des méthodes sur l'observateur directementDonné le modèle suivant et de l'observateur:
Je voudrais écrire un spec comme ceci (j'ai couru, et il passe)
no_peeping_toms est maintenant un bijou et peut être trouvé ici: https://github.com/patmaddox/no-peeping-toms
Si vous voulez tester que l'observateur observe le bon modèle et reçoit la notification comme prévu, voici un exemple d'utilisation de la RR.
your_model.rb:
your_model_observer.rb:
your_model_observer_spec.rb: