36 votes

Comment faire des tests d'intégration avec RSpec et Devise/CanCan ?

Si j'ai un modèle Devise User, dont seuls les utilisateurs ayant le rôle :admin sont autorisés à consulter une certaine url, comment puis-je écrire un test d'intégration RSpec pour vérifier que le statut renvoie 200 pour cette url ?

def login(user)
  post user_session_path, :email => user.email, :password => 'password'
end

Cela a été pseudo-suggéré dans la réponse à cette question : Suppression de l'authentification dans les spécifications de la demande mais je n'arrive pas à le faire fonctionner avec devise. CanCan reçoit un nil User lors de la vérification de Ability, qui n'a pas les bonnes permissions, naturellement.

Il n'y a pas d'accès au contrôleur dans les spécifications d'intégration, donc je ne peux pas stub current_user, mais j'aimerais faire quelque chose comme ça.

describe "GET /users" do
  it "should be able to get" do
    clear_users_and_add_admin #does what it says...
    login(admin)
    get users_path
    response.status.should be(200)
  end
end

NOTE ! !! : tout cela a changé depuis que la question a été posée. La meilleure façon actuelle de le faire est ici : http://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara

0voto

w1t3k Points 116

Depuis le milieu de l'année 2017, nous avons une opportunité supplémentaire, à mon avis meilleure, d'intégrer devise dans nos Rspecs. Nous sommes en mesure d'utiliser l'authentification des stub avec la méthode helper. sign in défini comme décrit ci-dessous :

module ControllerHelpers
    def sign_in(user = double('user'))
      if user.nil?
        allow(request.env['warden']).to receive(:authenticate!).and_throw(:warden, {:scope => :user})
        allow(controller).to receive(:current_user).and_return(nil)
      else
        allow(request.env['warden']).to receive(:authenticate!).and_return(user)
        allow(controller).to receive(:current_user).and_return(user)
      end
    end
  end

Vous devez également ajouter dans spec_helper.rb o rails_helper.rb référence au fichier nouvellement créé :

require 'support/controller_helpers'
  ...
  RSpec.configure do |config|
    ...
    config.include Devise::TestHelpers, :type => :controller
    config.include ControllerHelpers, :type => :controller
    ...
  end

Ensuite, dans la méthode, il suffit de placer au début du corps de la méthode sign_in pour le contexte de l'utilisateur authentifié et vous êtes prêt. Des détails à jour peuvent être trouvés dans la documentation de devise. aquí

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