ruby on rails 3 - tutorial - Error de warden creado para authenticate_user en la prueba funcional de Rails
rspec rails devise (4)
Tengo un recurso donde la nueva acción requiere que un usuario inicie sesión para verla. Si un usuario intenta crear un nuevo recurso sin iniciar sesión, se lo redirecciona (302''d) a la página de inicio de sesión. Mi prueba funcional se ve así:
test "should not get new unless logged in" do
get :new
assert_response :redirect
end
La stacktrace se ve más o menos así:
ArgumentError: uncaught throw :warden
/.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw''
/.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!''
/.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!''
Tengo un before_filter para authenticate_user antes de la nueva acción.
Entiendo por qué authenticate_user! está fallando pero no puedo entender por qué está arrojando un error. ¿No debería simplemente comportarse como lo hace en la aplicación web, es decir. redirige al usuario a la página de inicio de sesión
Gracias.
Sé que esta es una vieja pregunta ahora, pero encontré la respuesta de la wiki de Devise
https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara
Esto tiene una guía paso a paso que es demasiado complicado para volver a crear aquí, sin embargo, el primer paso es incluir a los ayudantes de prueba de Warden.
include Warden::Test::Helpers
Warden.test_mode!
Espero que esto ayude
Esto sucede cuando las inclusiones Warden y / o Devise faltan o no se agregan en el lugar correcto. Es tentador agregarlos a test_helper.rb, ya que es donde suelen ir los ayudantes, pero eso no funcionará correctamente para Devise.
Consulte https://github.com/plataformatec/devise/issues/1029 para obtener más detalles.
Para resolver este problema, incluya tanto el ayudante de Devise como el asistente de Warden en la clase de prueba del controlador de esta manera:
require ''test_helper''
class UserControllerTest < ActionController::TestCase
include Devise::TestHelpers
include Warden::Test::Helpers
Warden.test_mode!
def teardown
Warden.test_reset!
end
# test "the truth" do
# assert true
# end
end
Esto se requiere para cada controlador que usa la autenticación de Devise.
EDITAR: Como se menciona en los comentarios a continuación, la mudanza include Warden:TestHelpers
desde spec_helper.rb (o test_helper.rb) a rails_helper.rb también funciona.
Haz como dice la documentación :
class ActionController::TestCase
include Devise::TestHelpers
end
Particularmente, no include Devise::TestHelpers
en la class
ActiveSupport ::TestCase
.
include Devise::TestHelpers
este error, pero fue porque puse mi include Devise::TestHelpers
fuera de la definición de mi clase.
require ''test_helper''
include Devise::TestHelpers
class Admin::ObservationsControllerTest < ActionController::TestCase
setup do
...
Esto arrojó el error de guardián para 3 de mis 7 casos de prueba. Mover el include
dentro de la definición de la clase solucionó todo.