Stubbing l'authentification de la demande de spec
Lors de la rédaction d'une demande de spec, comment procédez-vous pour des séances et/ou de stub méthodes de contrôleur?
Je suis en train d'écraser l'authentification dans mes tests d'intégration - rspec/demandes
Voici un exemple d'un test
require File.dirname(__FILE__) + '/../spec_helper'
require File.dirname(__FILE__) + '/authentication_helpers'
describe "Messages" do
include AuthenticationHelpers
describe "GET admin/messages" do
before(:each) do
@current_user = Factory :super_admin
login(@current_user)
end
it "displays received messages" do
sender = Factory :jonas
direct_message = Message.new(:sender_id => sender.id, :subject => "Message system.", :content => "content", :receiver_ids => [@current_user.id])
direct_message.save
get admin_messages_path
response.body.should include(direct_message.subject)
end
end
end
Le helper:
module AuthenticationHelpers
def login(user)
session[:user_id] = user.id # session is nil
#controller.stub!(:current_user).and_return(user) # controller is nil
end
end
Et ApplicationController qui gère l'authentification:
class ApplicationController < ActionController::Base
protect_from_forgery
helper_method :current_user
helper_method :logged_in?
protected
def current_user
@current_user ||= User.find(session[:user_id]) if session[:user_id]
end
def logged_in?
!current_user.nil?
end
end
Pourquoi il n'est pas possible d'accéder à ces ressources?
1) Messages GET admin/messages displays received messages
Failure/Error: login(@current_user)
NoMethodError:
undefined method `session' for nil:NilClass
# ./spec/requests/authentication_helpers.rb:3:in `login'
# ./spec/requests/message_spec.rb:15:in `block (3 levels) in <top (required)>'
Vous devez vous connecter pour publier un commentaire.
Une demande spec est une fine enveloppe
ActionDispatch::IntegrationTest
, qui ne fonctionne pas comme le contrôleur spécifications (qui s'enroulentActionController::TestCase
). Même si il y a une séance de méthode, je ne pense pas qu'il est pris en charge (c'est à dire que c'est probablement parce qu'un module est inclus pour d'autres utilitaires comprend également que la méthode).Je voudrais vous recommandons de vous connecter en détachement à toute action que vous utiliser pour authentifier les utilisateurs. Si vous faites le mot de passe "mot de passe" (par exemple) pour tous les Utilisateurs des usines, alors vous pouvez faire quelque chose comme ceci:
ActionDispatch::IntegrationTest
est conçu pour simuler un ou plusieurs utilisateurs d'interagir via les navigateurs, sans avoir à utiliser de vrais navigateurs. Il y a potentiellement plus d'un utilisateur (c'est à dire de la session) et plus d'un contrôleur à l'intérieur d'un seul exemple, la session/contrôleur objets sont ceux qui sont utilisés dans la dernière demande. Vous n'avez pas accès avant de faire une demande.page.driver.post
avec CapybaraNote pour Concevoir des utilisateurs...
BTW, @David Chelimsky la réponse peut être besoin d'un peu de peaufinage si vous utilisez Concevoir. Ce que je fais dans mon intégration /demandes de tests (merci à cette StackOverflow post):
devise_for :users
dansconfig/routes.rb
fichier. Si vous avez spécifié quelque chose de différent, vous devrez modifier votre code en conséquence.'user[email]' => user.email
à'user[username]' => user.username
depuis mon application utilise le nom d'utilisateur de connexion au lieu de e-mail.FWIW, dans le portage de mon Test::Unit tests de RSpec, je voulais être capable de se connecter avec plusieurs (concevoir) des séances dans ma demande de spécifications. Il a fallu creuser, mais cela fonctionne pour moi. À l'aide de Rails 3.2.13 et RSpec 2.13.0.
Et...
Modifier: correction d'une faute
Vous pourrait assez facilement stub de la session ainsi.
Tous les rubis opérateurs spéciaux sont en effet des méthodes. L'appel de
1+1
est le même que1.+(1)
, ce qui signifie+
est juste une méthode. De même,session[:user_id]
est le même que l'appel à la méthode[]
sursession
, commesession.[](:user_id)
J'ai trouvé cela très utile pour Concevoir : https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-(et-RSpec)