update tutorial signup registrationscontroller rails instalar ruby-on-rails-3 devise functional-testing warden

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.



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.