2012-02-04 6 views
5

Estoy intentando iniciar una nueva sesión de usuario creando un ayudante que PUBLICA una nueva sesión de usuario. Esto es lo que tengoEspecificación de petición de RSpec/Capibara: no se puede obtener un dispositivo para POSTAR la nueva sesión de usuario

def login(user) 
    post user_session_path, :login => user.username, :password => user.password 
end 

Y para el usuario

user = Factory.create(:user) 

tengo una prueba en la RSpec que dirige al usuario a una página que requiere autenticación. Utilizando el helper, espero que se cree una nueva sesión de usuario. Sin embargo, al ejecutar la especificación, me está diciendo que la página actual es la pantalla de inicio de sesión. Esto indica que no se está creando una nueva sesión de usuario y el usuario está siendo redirigido a la pantalla de inicio de sesión cuando se accede al recurso restringido sin sesión de usuario. Mirando los registros de prueba, este es el caso.

También mirando los registros, se está diciendo que la acción POST no está autorizada.

Started POST "/login" for 127.0.0.1 at 2012-02-04 13:34:59 -0800 
Processing by SessionsController#create as HTML 
Parameters: {"login"=>"foo12", "password"=>"[FILTERED]"} 
Completed 401 Unauthorized in 1ms 
Processing by SessionsController#new as HTML 
Parameters: {"login"=>"foo12", "password"=>"[FILTERED]"} 
Rendered devise/shared/_links.erb (1.4ms) 
Completed 200 OK in 15ms (Views: 12.7ms | ActiveRecord: 0.0ms) 

Intenté manualmente usar la página de inicio de sesión a través de un navegador y pude crear una sesión muy bien. También escribí una prueba con Capybara que visita la página de inicio de sesión, completa las credenciales de usuario y envía. Esto crea una nueva sesión de usuario sin problemas.

+0

me encontré con esto brevemente, cuando Traté de combinar estas 2 declaraciones en 1, por error. Deberían estar separados. 'config.before (: cada uno) hacer DatabaseCleaner.strategy =: transacción extremo config.before (: cada uno) hacer DatabaseCleaner.start extremo ' en ' config.before (: cada) do DatabaseCleaner.strategy =: transacción DatabaseCleaner.start final ' – Ryan

Respuesta

27

que tiene esto funcione mediante la inclusión de Warden :: Prueba :: Helpers (que maquinan usos detrás de las escenas)

require 'spec_helper' 
include Warden::Test::Helpers 

describe "...Whatever..." do 

    before(:each) do 
    @user = Factory.create(:user) 
    login_as @user, :scope => :user 
    end 
    ... 

encontrado la solución de aquí: http://blog.joshmcarthur.com/2011/06/11/integration-tests-with-devise-and-rspec/

+0

Funcionó muy bien. ¡Gracias! – PetrolMan

+0

También trabajé con 'minitest' conmigo. ¡Gracias! –

+0

pero esto no prueba el escenario de envío de formulario real ¿verdad? – emaillenin

Cuestiones relacionadas