He estado jugando con Rails durante un par de años y he producido un par de aplicaciones aceptables que están en producción. Sin embargo, siempre evité hacer pruebas y he decidido rectificar eso. Intento escribir algunas pruebas para una aplicación que escribí para el trabajo que ya está en funcionamiento pero en constante revisión. Me preocupa que cualquier cambio rompa las cosas, así que quiero ponerme a prueba y ponerme en funcionamiento. He leído el libro de RSpec, he visto algunas grabaciones de pantalla, pero estoy luchando por comenzar (me parece que es algo que solo entiendes una vez que lo has hecho).¿Cómo simulo un inicio de sesión con RSpec?
Estoy tratando de escribir lo que debería ser una simple prueba de ReportsController. El problema con mi aplicación es que prácticamente todo se encuentra detrás de una capa de autenticación. Nada funciona si no has iniciado sesión, así que tengo que simular un inicio de sesión antes de poder enviar una solicitud de obtención simple (aunque supongo que debería escribir algunas pruebas para asegurarme de que nada funciona sin un inicio de sesión; llegaré a eso más tarde).
He creado un entorno de prueba con RSpec, Capybara, FactoryGirl y Guard (no estaba seguro de qué herramientas usar, por lo tanto, las sugerencias de Railscasts). La forma en que escribí mi prueba hasta ahora es crear un usuario en FactoryGirl como tal;
FactoryGirl.define do
sequence(:email) {|n| "user#{n}@example.com"}
sequence(:login) {|n| "user#{n}"}
factory :user do
email {FactoryGirl.generate :email}
login {FactoryGirl.generate :login}
password "abc"
admin false
first_name "Bob"
last_name "Bobson"
end
end
y luego escriba mi prueba como tal;
require 'spec_helper'
describe ReportsController do
describe "GET 'index'" do
it "should be successful" do
user = Factory(:user)
visit login_path
fill_in "login", :with => user.login
fill_in "password", :with => user.password
click_button "Log in"
get 'index'
response.should be_success
end
end
end
Esto no funciona así;
1) ReportsController GET 'index' should be successful
Failure/Error: response.should be_success
expected success? to return true, got false
# ./spec/controllers/reports_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
Curiosamente si cambio de prueba para response.should be_redirect
, se supera la prueba, que me hace pensar que todo está funcionando hasta ese momento, pero no se está reconociendo el inicio de sesión.
Así que mi pregunta es qué tengo que hacer para que este inicio de sesión funcione. ¿Necesito crear un usuario en la base de datos que coincida con las credenciales de FactoryGirl? Si es así, ¿cuál es el sentido de FactoryGirl aquí (y debería incluso usarlo)? ¿Cómo hago para crear este usuario falso en el entorno de prueba? Mi sistema de autenticación es uno muy simple hecho a sí mismo (basado en Railscasts episode 250). Probablemente, este comportamiento de inicio de sesión tendrá que replicarse para casi todas mis pruebas, entonces, ¿cómo hago para hacerlo una vez en mi código y que se aplique en todas partes?
Me doy cuenta de que esta es una gran pregunta, así que gracias por echar un vistazo.
Muy bien, gracias. Eso es un gran empujón en la dirección correcta. Lo puse en práctica y sigo teniendo una prueba fallida porque no tengo usuarios configurados en el entorno de prueba. ¿Cómo debo configurarlo? Use FactoryGirl? ¿Crearlos en la consola con un entorno de prueba? ¿Copia en una base de datos de producción existente al entorno de prueba? – brad
En realidad, no te preocupes. Logré hacerlo con FactoryGirl como tal; 'describe" GET 'index' "do; "debería ser exitoso"; usuario = FactoryGirl.create (: usuario); inicio de sesión (usuario); obtener: índice; response.should be_success; final; final; '. Tuve que cambiar 'request.session [: user]' por 'request.session [: user_id]' pero, aparte de eso, todo en tu código me funcionaba y ahora tengo mi primera prueba de aprobación. Gracias. – brad
Sí, su solución con FactoryGirl para crear el usuario es esencialmente lo que hacemos también. Por favor, asegúrese de aceptar la respuesta si funciona para usted. ¡Gracias! – Brandan