Saltar al contenido

¿Cómo simulo un inicio de sesión con RSpec?

Después de tanto trabajar ya dimos con la contestación de este dilema que muchos lectores de nuestro sitio presentan. Si quieres compartir algún detalle no dejes de compartir tu conocimiento.

Solución:

La respuesta depende de su implementación de autenticación. Normalmente, cuando un usuario inicia sesión, establecerá una variable de sesión para recordar a ese usuario, algo así como session[:user_id]. Sus controladores buscarán un inicio de sesión en un before_filter y redirigir si no existe tal variable de sesión. Supongo que ya estás haciendo algo como esto.

Para que esto funcione en sus pruebas, debe insertar manualmente la información del usuario en la sesión. Esto es parte de lo que usamos en el trabajo:

# spec/support/spec_test_helper.rb
module SpecTestHelper   
  def login_admin
    login(:admin)
  end

  def login(user)
    user = User.where(:login => user.to_s).first if user.is_a?(Symbol)
    request.session[:user] = user.id
  end

  def current_user
    User.find(request.session[:user])
  end
end

# spec/spec_helper.rb
RSpec.configure do |config|
  config.include SpecTestHelper, :type => :controller
end

Ahora, en cualquiera de nuestros ejemplos de controlador, podemos llamar login(some_user) para simular el inicio de sesión como ese usuario.


También debo mencionar que parece que estás haciendo pruebas de integración en esta prueba de controlador. Como regla general, las pruebas de su controlador solo deben simular solicitudes para acciones de controlador individuales, como:

it 'should be successful' do
  get :index
  response.should be_success
end

Esto prueba específicamente una sola acción de controlador, que es lo que desea en un conjunto de pruebas de controlador. Luego puede usar Capybara/Cucumber para pruebas de integración de extremo a extremo de formularios, vistas y controladores.

Agregar archivo auxiliar en especificación/soporte/controlador_helpers.rb y copie el contenido a continuación

module ControllerHelpers
    def sign_in(user)
      if user.nil?
        allow(request.env['warden']).to receive(:authenticate!).and_throw(:warden, :scope => :user)
        allow(controller).to receive(:current_user).and_return(nil)
      else
        allow(request.env['warden']).to receive(:authenticate!).and_return(user)
        allow(controller).to receive(:current_user).and_return(user)
      end
    end
  end

Ahora agregue las siguientes líneas en especificación/rails_helper.rb o especificación/spec_helper.rb
expediente

require 'support/controller_helpers'

RSpec.configure do |config|

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

  end

Ahora en el archivo de especificaciones de su controlador.

describe  "GET #index" do

    before :each do        
        @user=create(:user)
        sign_in @user
    end
      ...
end

Diseñar enlace oficial

Como no pude hacer que la respuesta de @ Brandan funcionara, pero basándome en ella y en esta publicación, llegué a esta solución:

# spec/support/rails_helper.rb
Dir[Rails.root.join("spec/support/**/*.rb")].each   # Add this at top of file

...

include ControllerMacros # Add at bottom of file

Y

# spec/support/controller_macros.rb
module ControllerMacros

  def login_as_admin
    admin = FactoryGirl.create(:user_admin)
    login_as(admin)
  end

  def login_as(user)
    request.session[:user_id] = user.id
  end

end

Luego, en tus pruebas puedes usar:

it "works" do
  login_as(FactoryGirl.create(:user))
  expect(request.session[:user_id]).not_to be_nil
end

Eres capaz de auxiliar nuestro análisis dejando un comentario o dejando una valoración te lo agradecemos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *