Pruebas de integración de Capybara, Devise, CanCan y RSpec: inicio de sesión válido en 302 redirecciones a example.com
Actualización: vea el final de la publicación para ver cómo funcionan las especificaciones ahora que tengo mis especificaciones en especificaciones / solicitudes en lugar de especificaciones / controladores. Todavía me pregunto cómo obtener un usuario con sesión iniciada válido para las pruebas de integración con mis controladores.
Estoy trabajando con Devise y CanCan por primera vez y estoy teniendo dificultades para realizar las pruebas de integración más básicas, por lo que estoy verificando que un usuario registrado está ... bueno ... conectado. He leído innumerables publicaciones y respuestas relacionadas con las pruebas de integración de Devise y RSpec (es decir, acelerándolas accediendo a la sesión directamente a través dehttps://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara, http://schneems.com/post/15948562424/speed-up-capybara-tests-with-deviseyCapybara, RSpec y Devise: ¿alguna forma de hacer que las pruebas de integración sean más rápidas evitando el inicio de sesión lento y configurando la sesión directamente?, pero ni siquiera conseguí que una publicación estándar funcionara como se esperaba y estoy desconcertado:
El entorno de desarrollo funciona bien (puede iniciar sesión y redirigirse a la página adecuada, con el enlace de inicio de sesión de navegación cambiado a cerrar sesión, etc.).test.log indica que no hay problemas hasta que realiza un redireccionamiento 302 ahttp://www.example.com en lugar de mi root_path.Debido a la gran cantidad de usuarios con problemas similares con diferentes soluciones, obviamente no soy el único que ha tenido este problema, ya que varios aspectos de la sesión, etc., no están disponibles en diferentes escenarios.
Prueba de desnudamiento:
subject { page }
describe 'should be able to log in' do
before do
visit '/users/sign_in'
user = FactoryGirl.create(:admin)
#user.add_role :admin
fill_in 'Username', with: user.username
fill_in 'Password', with: user.password
click_on 'Sign in'
end
it { should have_link 'Logout' }
end
...
Salida log.test relevante:
Started POST "/users/sign_in" for 127.0.0.1 at 2012-11-06 17:31:10 -0800
Processing by Devise::SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "user"=>{"username"=>"username1", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
[1m[36mUser Load (0.1ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."username" = 'username1' LIMIT 1[0m
[1m[35m (0.0ms)[0m SAVEPOINT active_record_1
[1m[36m (0.0ms)[0m [1mRELEASE SAVEPOINT active_record_1[0m
[1m[35m (0.0ms)[0m SAVEPOINT active_record_1
[1m[36m (0.1ms)[0m [1mUPDATE "users" SET "last_sign_in_at" = '2012-11-07 01:31:10.722712', "current_sign_in_at" = '2012-11-07 01:31:10.722712', "last_sign_in_ip" = '127.0.0.1', "current_sign_in_ip" = '127.0.0.1', "sign_in_count" = 1, "updated_at" = '2012-11- 07 01:31:10.723051' WHERE "users"."id" = 1[0m
[1m[35m (0.0ms)[0m RELEASE SAVEPOINT active_record_1
Redirected to http://www.example.com/
Completed 302 Found in 12ms (ActiveRecord: 0.0ms)
Las rutas eliminadas.rb:
authenticated :user do
root :to => 'home#index'
end
root :to => "home#index"
devise_for :users
resources :users
Habilidad eliminada:
Habilidad de clase incluye CanCan :: Habilidad
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.has_role? :admin
can :manage, :all
end
...
Y para ser cuidadoso, el actual Gemfile:
source 'https://rubygems.org'
gem 'rails', '3.2.8'
gem "bootstrap-sass", "~> 2.1.0.1"
gem 'faker', '1.1.2'
gem 'will_paginate', '~> 3.0.3'
gem 'bootstrap-will_paginate', '~> 0.0.9'
gem 'jquery-rails'
gem 'client_side_validations'
gem 'thin'
gem "devise", "~> 2.1.2"
gem "cancan", "~> 1.6.8"
gem "rolify", "~> 3.2.0"
gem "simple_form", "~> 2.0.4"
group :assets do
gem 'sass-rails', '~> 3.2.3'
gem 'coffee-rails', '~> 3.2.1'
gem 'uglifier', '>= 1.0.3'
end
group :development, :test do
gem 'sqlite3', '1.3.5'
gem "rspec-rails", "~> 2.11.4"
gem 'guard-rspec', '1.2.1'
#gem 'listen', github: 'guard/listen', branch: 'polling/double'
gem 'guard-spork'
gem 'guard-cucumber'
gem 'spork', '0.9.2'
gem "factory_girl_rails", ">= 4.1.0"
end
group :development do
gem 'annotate', '2.5.0'
gem "quiet_assets", ">= 1.0.1"
end
group :test do
gem 'capybara', ">= 1.1.2"
gem "email_spec", ">= 1.2.1"
gem "cucumber-rails", ">= 1.3.0", :require => false
gem "database_cleaner", ">= 0.9.1"
gem "launchy", ">= 2.1.2"
gem 'rb-fsevent', '0.9.1', :require => false
gem 'growl', '1.0.3'
gem 'terminal-notifier-guard'
end
group :production do
gem 'pg', '0.12.2'
end
Hay otro usuario que tuvo problemas con esta tarea básica, pero resultó que era simplemente un error de sintaxis (verPrueba de integración de inicio de sesión con rspec / devise) así que estoy seguro de que me estoy perdiendo algo muy obvio.
Actualizar:
Tienes que estar bromeando. Después de dejarlo por un par de horas, resultó que tenía esta especificación en alguna de las especificaciones / controladores, cuando simplemente al cambiarla a especificación / solicitud, todo estaba en verde.
Yo cito:
Si está usando Rails, ponga sus especificaciones de Capybara en spec / request o spec / integration.
Encontrado enhttps://github.com/jnicklas/capybara#readme
Sin embargo, todavía me pregunto cómo, para futuros requisitos, puedo realizar pruebas de integración en mis controladores que deberán tener un usuario conectado ... para otras aplicaciones que no son de Devise en el pasado, esto ha sido tan simple como algo así como el seguimiento:
describe SomeController do
let(:user) { FactoryGirl.create(:user) }
before { valid_sign_in user }
...
donde mi ayudante es simplemente
def valid_sign_in(user)
visit signin_path
fill_in "Email", with: user.email
fill_in "Password", with: user.password
uncheck(:remember_me)
click_button "Sign In"
# Sign in when not using Capybara as well.
cookies[:remember_token] = user.remember_token
end