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
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
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" :) –
Holy frijoles! Shoulda a une méthode "render_with_layout" .../moi s'évanouit –