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étodossign_in
ysign_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