5 votes

Test de l'appel de before_filter dans l'action

Comment tester que lorsqu'on accède à une action dans un contrôleur, le before_filter de ce contrôleur sera exécuté ?

Le filtre before_filter est testé dans un groupe d'exemples séparé afin qu'il ne soit pas nécessaire de dupliquer les tests pour toutes les actions qui dépendent du filtre before_filter.

Si j'ai

controller.should_receive(:my_before_filter)

dans mon exemple, cela fonctionne bien. Cependant, le fait d'avoir l'attente susmentionnée semble faire en sorte que la logique de l'application my_before_filter n'est pas exécuté (il devrait affecter une variable d'instance).

Comment surmonter cette restriction ou simuler le comportement de my_before_filter (il définit une variable d'instance sur le contrôleur) ? Ou existe-t-il une meilleure façon de procéder ?


Comme il est maintenant clair que je faisais tout de travers, j'aimerais quand même savoir comment on pourrait simuler le comportement de before_filter qui définit une variable d'instance. Il doit sûrement être possible de le faire dans une spécification de contrôleur ?

7voto

zetetic Points 29261

Tester le filtre, c'est regarder de trop près l'implémentation, IMO. Vous voulez vous assurer que l'affectation de la variable d'instance a bien lieu, et non pas savoir si elle a lieu dans un filtre ou dans une action - testez le résultat, pas l'implémentation.

3voto

Kyle Heironimus Points 3015

Le paramètre should_receive de RSpec implique que vous vous attendez à recevoir la méthode, mais en tant que méthode fantaisie, de sorte qu'elle n'appelle pas réellement la méthode réelle, qui est "my_before_filter" dans ce cas.

http://axonflux.com/rspecs-shouldreceive-doesnt-ac

Si my_before_filter est déjà testé dans un test séparé, comme vous le dites, vous ne devriez pas vraiment vous soucier du fait que le vrai filtre est appelé.

Vous devez donc tester la fonctionnalité réelle dans un test, et tester qu'elle est appelée dans un autre, comme vous le faites déjà.

Par ailleurs, si vous avez besoin qu'elle renvoie une valeur, vous pouvez consulter la rubrique "Valeurs de retour" à la page suivante.

http://rspec.info/documentation/mocks/message_expectations.html

1voto

Chase T. Points 915

En réponse à votre question

"J'aimerais encore savoir comment on pourrait simuler le comportement de before_filter qui définit une variable d'instance".

voici ma réponse :

controller.should_receive(:my_before_filter) 
controller.instance_variable_set(:@my_instance_var, "some value")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X