Интеграционные тесты Capybara, Devise, CanCan и RSpec: действительный вход 302 перенаправляет на example.com
Обновление: см. Конец поста, чтобы узнать, как теперь работают спецификации, так как у меня есть свои спецификации в спецификации / запросах вместо спецификации / контроллеров. Все еще задаюсь вопросом, как получить действительного зарегистрированного пользователя для интеграционных тестов с моими контроллерами.
Я работаю с Devise и CanCan впервые и испытываю трудности с проведением самых базовых интеграционных тестов, в результате чего я проверяю, что вошедший в систему пользователь ... хорошо ... вошел в систему. Я прочитал бесчисленное множество сообщений и ответы, касающиеся интеграционных тестов Devise и RSpec (т. е. ускорения их путем прямого доступа к сеансу черезhttps://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara, http://schneems.com/post/15948562424/speed-up-capybara-tests-with-devise, а такжеCapybara, RSpec и Devise: можно ли ускорить интеграционные тесты, обойдя медленный вход в систему и установив сеанс напрямую?, но я не смог даже заставить стандартную почту работать, как ожидалось, и я сбит с толку:
Среда разработки работает нормально (можно войти в систему и перенаправить на соответствующую страницу, при этом ссылка для входа в систему навигации изменится на выход и т. Д.)test.log не показывает проблем, пока не выполнит перенаправление 302 наhttp://www.example.com вместо моего root_path.Из-за множества пользователей с похожими проблемами с различными решениями, я, очевидно, не единственный, у кого была эта проблема, поскольку различные аспекты сеанса и т. Д. Недоступны в различных сценариях.
Урезанный тест:
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
...
Соответствующий log.test вывод:
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)
Урезанные маршруты.
authenticated :user do
root :to => 'home#index'
end
root :to => "home#index"
devise_for :users
resources :users
Раздетая Способность:
Возможность класса включает CanCan :: Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.has_role? :admin
can :manage, :all
end
...
И чтобы быть точным, текущий 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
Есть еще один пользователь, у которого были проблемы с этой основной задачей, но оказалось, что это просто синтаксическая ошибка (см.Интеграционный тест входа в систему с помощью rspec / devise) так что я уверен, что мне просто не хватает чего-то очень очевидного.
Обновить:
Ты, должно быть, шутишь. После того, как я оставил его на пару часов, оказалось, что эта спецификация по каким-то причинам была у меня в спецификации / контроллерах, когда простое переключение на спецификацию / запросы сделало все зеленым.
Я цитирую:
Если вы используете Rails, поместите свои спецификации Capybara в спецификации / запросы или спецификации / интеграции.
Найдено вhttps://github.com/jnicklas/capybara#readme
Тем не менее, мне все еще интересно, как для будущих требований я могу провести интеграционные тесты на моих контроллерах, которые должны будут иметь зарегистрированного пользователя .... для других приложений не от Devise в прошлом это было так просто, как что-то вроде последующий:
describe SomeController do
let(:user) { FactoryGirl.create(:user) }
before { valid_sign_in user }
...
где мой помощник просто
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