Comment tester cette before_filter fonctionne correctement avec RSpec dans les Rails
J'ai un check_user_access_control
before_filter dans mon ApplicationController qui vérifie la session de l'utilisateur des rôles et des autorisations avant il lui permet de à travers. Je suis en train d'écrire quelques tests et je ne peux pas trouver un bon moyen de le faire.
Pour l'indice simple des actions je n'ai tout simplement:
it "allows access to mod" do
login_as(Factory(:mod)) # this is a spec helper
get :index
response.code.should == "200"
end
et il fonctionne très bien. Pour modifier/show/créer et à d'autres mesures de certains paramètres, les interactions avec la base de données et possible de rediriger après leur exécution, il a besoin de beaucoup trop d'autres choses à être écrasé.
Est-il un moyen de tester si une action spécifique a été appelé après la before_filters? Je suis à la recherche de quelque chose comme controller.should_receive(:action_name)
(qui ne fonctionne pas) pour remplacer le response.code.should == "200"
ligne avec.
versions: rails 3.0.4 et rspec 2.5
J'ai essayé une autre approche. Nous avons une méthode dans ApplicationController appelé redirect_to_login
que je suis maintenant vérifier avec controller.should_receive(:redirect_to_login)
et les œuvres.
Lorsqu'il détecte correctement si l'utilisateur est autorisé ou pas, c'talons de la méthode, ce qui signifie que le contrôleur de l'action est exécutée si l'utilisateur est ou non autorisé. En outre, l'action dépend de paramètres et de base de données et nous ne voulons pas que.
Si maintenant je stub de la méthode d'action avec controller.stub!(:action_name)
, l'action n'est pas exécutée, mais RSpec est toujours à la recherche pour le modèle. Ainsi, certaines actions n'ont pas de modèles, ils ont juste à la fin avec un redirect_to :action => :somewhere_else
ou render :text => "foobar"
qui, à ce stade, nous ne nous soucions pas.
Dans le tri, ce dont j'ai besoin maintenant est de trouver une façon de faire de RSpec PAS s'inquiéter sur le modèle de l'existence.
OriginalL'auteur Kostas | 2011-05-04
Vous devez vous connecter pour publier un commentaire.
Quand stubbing, vous pouvez toujours donner un mannequin de mise en œuvre. À l'intérieur de cette application, vous pouvez générer une erreur, assurez-vous que tous l'exécution est interrompue, ou vous faire une redirection de toute façon.
E. g.
ou
Pour plus d'informations, consultez le génial rspec documentation.
Espère que cela aide.
controller.should_not_receive(:redirect_to_log)
dans l'exemple.Normalement, j'aurais très certainement tester la méthode que vous utilisez comme
before_filter
autonome: étant donné un utilisateur, ne il prendre la bonne décision si oui ou non l'accès est autorisé. Sur votre contrôleur, vous pourriez juste test: si un utilisateur ne devrait pas être autorisé à accéder, puis leredirect_to_log
devrait être appelé (ce que j'ai montré ci-dessus). Si un utilisateur a accès, leredirect_to_log
ne devrait pas être appelé, etresponse.status.should == 200
(dans ce cas, je suppose que vous ne serait pas avoir des difficultés à trouver le point de vue, non?). DONC, il suffit de tester qu'il fonctionne avec succès.J'ai essayé cette approche, mais le problème est que certaines actions (comme le créer) ne se termine pas avec un 200 mais avec un 302 (redirection). Aussi certains d'entre eux ont besoin d'une tonne de paramètres de base de données et l'accès à la fonction (même système de fichiers l'accès pour certains d'entre eux) que j'ai envie de by-pass de cause vous ne pouvez stub tellement. Exécution de la méthode de l'action elle-même est ce qui me tue cause, il n'est pas le but de ces tests d'authentification de toute façon.
JE PENSE TROUVÉ UN MOYEN!!! Post-it comme une modification à la question dès que je suis confortablement assurer qu'il fonctionne correctement.
OriginalL'auteur nathanvda
D'étendre @nathanvda réponse:
Vous devez spécifier
controller
dans le bloc:RSpec a une correspondance qui est aussi appelé
redirect_to
qui prévaut lors de la recherche de la méthode. L'appelant directement sur le contrôleur fonctionne autour de cela.OriginalL'auteur Shepmaster
Solution finale, grâce à nathanvda:
posté sur https://gist.github.com/957565
OriginalL'auteur