2011-09-17 20 views
16

Estoy teniendo problemas con el controlador de prueba rspec para la autenticación de dispositivo.prueba de controlador rspec con autenticación de dispositivo

Tengo un siguiente configuración

He incluido

config.include Devise::TestHelpers, :type => :controller 

en mi spec_helper.rb

En mi merchants_controller_spec.rb

describe MerchantsController do 
    before :each do 
    @user = Factory(:user) 
    @merchant = Factory(:merchant, :user_id => @user.id,:is_approved => false, :is_blacklisted => false) 
    controller.stub!(:current_user).and_return(@user) 
    end 
    describe "GET index" do 
    it "assigns all merchants as @merchants" do 
     merchant = Factory(:merchant,:is_approved => true, :is_blacklisted => false) 
     get :index 
     assigns(:merchants).should eq([merchant]) 
    end 
    end 
end 

Mi merchants_controller.rb

class MerchantsController < ApplicationController 

    before_filter :authenticate_user! 
    def index 
    @merchants = Merchant.approved 
    debugger 
    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @merchants } 
    end 
    end 
end 

que tienen un ámbito de aplicación aprobado en el modelo comercial

scope :approved, where(:is_approved => true, :is_blacklisted => false) 

Ahora mi problema es que a pesar de que stubbed current_user y volví @user como current_user, mi especificación de índice merchants_controller está fallando. ¡Pero si hago un comentario sobre authenticate_user! luego la especificación pasa,

sin authenticate_user! el depurador de acción de índice está atrapado pero con authenticate_user! el depurador no está atrapado.

Creo que hay un problema al sustituir current_user y no puedo resolverlo.

me ayude ..

Respuesta

22

¿Ha leído a través de los documentos en github:?

Diseñar incluye algunos ayudantes pruebas de especificaciones funcionales. Para usarlos, solo necesita incluir Devise::TestHelpers en su clase de prueba y usar los métodos sign_in y sign_out. Tales métodos tienen la misma firma que en los controladores:

sign_in :user, @user # sign_in(scope, resource) 
sign_in @user   # sign_in(resource) 

sign_out :user   # sign_out(scope) 
sign_out @user   # sign_out(resource) 
+1

Substituí controller.stub! (: Current_user) .and_return (@user) con @user sign_in pero todavía no resuelve mi problema Creo que el usuario aún no está autenticado como depurador dentro de la acción del índice que aún no está capturada. ¿Algunas ideas? – Gagan

+0

Ojalá pudiera votar esto dos veces. Tenía una fábrica anidada para crear mi administrador, y no pude entender por qué el usuario se estaba creando pero no se había conectado. – Arel

2

Otra alternativa

RSpec.describe YourController, :type => :controller do 
    before do 
    user = FactoryGirl.create(:user) 
    allow(controller).to receive(:authenticate_user!).and_return(true) 
    allow(controller).to receive(:current_user).and_return(user) 
    end 

    # rest of the code 
end 
+0

Esto funciona para mí, para TODAS mis pruebas. Guías en https://github.com/plataformatec/devise/wiki/How-To:-Stub-authentication-in-controller-specs y https://github.com/plataformatec/devise/wiki/How-To:- Test-controllers-with-Rails-3-and-4-% 28and-RSpec% 29 funciona para un ejemplo, pero no para un conjunto completo. – Foton

Cuestiones relacionadas