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.