2010-08-18 22 views
1

J'ai écrit des tests RSpec pour certains contrôleurs Rails et j'ai découvert une forte impulsion pour s'assurer que l'authentification Authlogic fonctionne correctement. Je pense aussi que je devrais vérifier que chaque action utilise la même disposition à l'échelle de l'application. Cependant, écrire des tests pour ce comportement dans chaque action semble stupide. Ce que j'aimerais voir, ce sont des filtres d'une ligne pour les filtres et les mises en page, semblables aux coupleurs de Shoulda pour les associations et les vérifications. Malheureusement, aucun de ces filtres ne semble disponible (à l'exception de certaines macros Test :: Unit pour les filtres dans this blog post). Je suis tenté de les écrire moi-même, mais ne pas être en mesure de trouver quelqu'un qui l'a déjà fait me pose la question de savoir si un tel besoin existe vraiment. Donc, ma question est la suivante: comment tester le comportement commun de vos contrôleurs (si vous le testez du tout), et est-ce que les filtres de testeurs et les mises en page de testeurs one-liner seraient utiles? Moi-même, j'essaie de choisir entre les spécifications d'un contrôleur combinées avec une spécification du filtre, ou simplement de spécifier le filtre et d'ignorer les filtres et les mises en page dans les contrôleurs (puisqu'ils ne sont qu'une ligne de code).Comment puis-je tester le comportement du contrôleur Rails courant tout en restant SEC?

Répondre

0

Je n'aime pas l'idée d'écrire des spécifications pour les filtres - cela semble trop proche de l'implémentation. Si vous aviez utilisé des méthodes TDD/BDD pour construire votre contrôleur à partir de zéro, vous auriez probablement écrit l'action en premier, ajouté une certaine logique (par exemple pour gérer l'authentification) et ensuite réalisé que cela devrait passer dans un filtre. Si votre spec est le long des lignes de « Rejeter une demande d'index si l'utilisateur n'est pas l'utilisateur du compte », vos spécifications devrait être en mesure de faire quelque chose comme (Aircode):

current_user = Factory.create(:unauthorized) 
controller.should_not receive(:index) 
get :index 
request.should redirect_to(some_safe_path) 

Et il doesn Peu importe si l'action utilise un filtre ou non.

Vous pouvez sécher les spécifications du contrôleur avec des macros Rspec. Alors (plus la main en agitant):

describe MyController do 
    should_reject_anonymous(self) 
    ... 
end 

module ControllerMacros 
    def should_reject_anonymous(test_controller) 
    describe test_controller, "Authentication" do 
     it "rejects index" do 
     test_controller.should_not_receive(:index) 
     get :index 
     response.should redirect_to(some_safe_path) 
     end 
    end 
    end 
end 
+0

Ok, donc l'idée est de tester le comportement, mais le faire dans une macro. Bonne idée. Je n'ai pas vraiment écrit les contrôleurs, j'essaie juste de les spécifier correctement maintenant qu'ils ont été déposés sur mes genoux :) Serait-il raisonnable de passer toutes les actions en même temps et de faire un bloc "ça" pour chaque? Je pourrais faire quelque chose de similaire pour vérifier l'utilisation correcte de la mise en page. Il semble que ce soit trop petit et spécifique au projet pour être aussi digne de gemme, de sorte que répond à ma question "devrais-je publier ceci" :) –

+0

Holy frijoles! Shoulda a une méthode "render_with_layout" .../moi s'évanouit –