2012-09-01 11 views
9

Por alguna razón, no puedo hacer que el método de ayuda intente sign_in funcione. current_user sigue siendo nulo. ¿Alguna idea de cuál podría ser el problema?Devise Test Helper - sign_in no funciona

prueba:

before :each do 
    @user = FactoryGirl.create :user 
    sign_in @user 
    end 

    describe "GET index" do 
    it "assigns all subscribers as @subscribers" do 
     subscriber = @user.subscribers.create! valid_attributes 
     get :index 
     assigns(:subscribers).should eq([subscriber]) 
    end 
    end 

Implementación:

def index 
    @subscribers = current_user.subscribers.all <------- ERROR 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @subscribers } 
    end 
    end 

Error: 
NoMethodError: 
     undefined method `subscribers' for nil:NilClass 

se aprecia ninguna ayuda. ¡Gracias!

Respuesta

8

Parece que ha resuelto esto, a juzgar por su código. He tenido que pasar esto antes, y por alguna razón me atrapa todo el tiempo.

El andamio rspec/rails para las especificaciones del controlador no funcionará con Devise :: TestHelpers de fábrica.

get :index, {}, valid_session 

La llamada a valid_session sobrescribe las cosas de la sesión que configura Devise. Quitarlo:

get :index, {} 

Esto debería funcionar!

+0

yup, ese era el problema! ¡Gracias! :) – Karan

+1

Al principio pensé que esto no funcionaba porque lo intenté en una sesión de depuración 'pry' y falló. Al salir de la palanca y configurarlo, funcionó para mí. –

+0

¿De qué archivo está hablando exactamente? – d34th4ck3r

5

Para la especificación, asegúrese de include Devise::TestHelpers. Para hacerlo más fácil, en mi spec/spec_helper.rb, que tengo:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

que incluye automáticamente para todas las características del controlador.

Además, es necesario hacer esto para conseguir sign_in al trabajo:

@request.env["devise.mapping"] = Devise.mappings[:user] 
get :new 

Es probablemente el mejor para agregar a su @request.env["devise.mapping"] = Devise.mappings[:user] antes (: cada uno). (Tenga en cuenta que puede hacer esto en su configuración si no desea hacer esto para cada controlador).


Para la parte current_user, asegúrese de que tiene un modelo User, donde se llama a devise

class User < ActiveRecord::Base 
    # call devise to define user_signed_in? and current_user 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :confirmable 
    # though you don't have to include all these modules 
end 

Diseñar utiliza la llamada en el modelo de usuario para definir user_signed_in? y current_user en sus controladores. La razón es que si usted tiene:

class Admin < ActiveRecord::Base 
    devise 
end 

luego concebir tendrá métodos y admin_signed_in?current_admin definido.

+0

gracias por su ayuda. Añadí el Devise :: TestHelpers - no hizo la diferencia:/Mi modelo de usuario llama a idear. Pude alojar mi proyecto en git hub: acaba de comenzar, por lo que no tiene mucho código ... – Karan

+0

https://github.com/karangb/smads/ – Karan

+0

si 'current_user' es nulo, también puede indicar que ningún usuario ha iniciado sesión (para el segundo problema). – ronalchn

8

Si se incluye el módulo Confirmable en su modelo User (u otro modelo de legado-autentificable), entonces la prueba @user que cree debe ser confirmado para el sign_in surta efecto:

before :each do 
    @user = FactoryGirl.create :user 
    @user.confirm! 
    sign_in @user 
end 

(veo que este no era su problema, pero tal vez otro lector se beneficie de ello.)

+0

Gracias por esto, he estado tratando de entender por qué 'sign_in' no funcionaba en mis pruebas. – jessewmc

+0

FYI para lectores: '¡confirme!' ha sido desaprobado; deberías usar 'confirmar' en su lugar. – rbonick

+0

@rbonick No pude obtener 'confirm!' O '' confirm' para funcionar. Saqué toda la línea y mis pruebas aún pasan aunque usando * esta * respuesta. No estoy seguro de qué hacer con eso. ¿Está bien hacer eso? – mikelovelyuk

0

Encontré este problema al intentar probar que un punto final SSO que estaba escribiendo estaba creando una sesión para un usuario.Dado que solo se aplicaba a una prueba, solo necesitaba agregar el siguiente bloque antes de mi prueba

before do 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    user = FactoryGirl.create(:user, :email => email, :password => "password") 
    user.confirm! 
    end 

    it "should create and session for the user and redirect to home page" do 
Cuestiones relacionadas