Test de contrôle d'accès avec le concombre et capybara
-
27-10-2019 - |
Question
J'utilise rails_admin et dans mes rails concevoir 3 applications et l'écriture de tests pour le contrôle d'accès dans le concombre.
Je veux tester que quelqu'un ne administrateur ne peut pas accéder toutes les routes de rails_admin (par exemple)
Si je explicitement test comme ceci:
Scenario: An authenticated user cannot access site administration
Given I am an authenticated user "kate", "kate@example.com"
When I visit the administration page
Then I should see access denied
Je peux correspondre à la chaîne « la page d'administration » à la route « rails_admin_dashboard_path » et faire mon test passe très bien. Mais cela semble tester l'application dans le mauvais sens. Je veux tester toutes les routes (boucle à travers eux en quelque sorte) plutôt que de les impliquer et peut-être manquer un ou deux.
Quelque chose comme ceci:
Scenario: An authenticated user cannot access site administration
Given I am an authenticated user "kate", "kate@example.com"
When I visit ANY administration page
Then I should see access denied
Quelqu'un pourrait-il me conseiller sur la façon de tester efficacement ce? Est-ce que je prends la bonne approche? Dois-je faire cela à la place rspec?
Comme vous pourriez être en mesure de dire, je suis un peu n00b.
La solution
Je ne pense pas que vous devriez viser à tester tous les itinéraires possibles dans vos scénarios de concombre. Comme Andrea S. suggère, si tous vos contrôleurs d'administration ont une base commune, alors il devrait être suffisant pour vérifier la page d'accueil d'administration.
Autres conseils
Une approche serait de créer un contrôleur de base dans votre espace de noms admin que tous les autres admin / contrôleurs héritent. Vous pouvez mettre un filtre avant dans ce contrôleur de base pour vérifier l'authentification admin. Comme ceci:
#app/controllers/admin/base.rb
class Admin::Base < ApplicationController
before_filter :ensure_admin_logged_in
end
Et que tous vos autres contrôleurs dans l'espace de noms Hériter admin de celui-ci:
#app/controllers/admin/Pages.rb
class Admin::PagesController < Admin::Base
layout "admin"
end