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

Respuestas a la pregunta(1)

Su respuesta a la pregunta