testing authentication rspec controller

testing - Prueba de controlador rspec con dispositivo de autenticación



authentication controller (2)

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

Tengo una configuración siguiente

He incluido

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

en mi spec_helper.rb

En mis comerciantes_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

Mis comerciantes_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

Tengo un alcance aprobado en modelo mercantil.

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

Ahora mi problema es a pesar de que apagué current_user y devolví @user como current_user, la especificación del índice My merchants_controller está fallando. Pero si me comento a authenticate_user! entonces la especificación pasa,

sin autenticar_usuario! el depurador de la 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.

Ayúdame..


¿Has leído los documentos en github ?:

Devise incluye algunos ayudantes de pruebas para las 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)


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