Ошибка входа при тестировании с помощью Capybara, Rspec и Selenium в Rails 3.1
Я добавил некоторые диалоговые окна подтверждения для моего приложения Rails 3.1 и, перед этим, их соответствующие тесты. Следуя модели Railscast # 257, я добавил ': js = > true' к тесту, добавил database_cleaner и модифицировал файл spec_helper.rb соответственно,
Когда я запускаю тест, Firefox запускает, Capybara-Selenium заполняет поля соответствующим именем пользователя и паролем, но сбой входа (т.е. "неверное имя пользователя/пароль".) Другие тесты,: js = > true ', а также логин, все равно передайте.
Я хотел бы добавить больше javascript в мое приложение в будущем, и я избегаю решений, которые могли бы взломать Capybara, чтобы заставить это работать (например, нажмите "ОК" во всех диалогах.)
Любые идеи, что мне может не хватать? Не удалось, какие-либо предложения по отладке этой проблемы?
Спасибо.
Ответы
Ответ 1
Вы должны установить use_transactional_fixtures = false для своих тестов selenium.
Это можно сделать в spec_helper.rb с помощью
config.use_transactional_fixtures = false
для всех ваших тестов.
Или сделайте это для одного тестового теста:
describe 'testcase' , :type => :request do
self.use_transactional_fixtures = false
it 'your test', :js => :true do
testing...
end
end
Это происходит из-за того, что тесты селена получают доступ к базе данных по-другому. С включенными транзакционными светильниками селен будет работать с пустой базой данных → ваш пользователь не существует, и вы не можете войти в систему.
Для обычных тестов вы должны использовать транзакционные приборы, потому что ваши тесты выполняются намного быстрее.
Ответ 2
По Avdi Grimm post (содержит подробное объяснение):
Gemfile:
group :test do
gem 'database_cleaner'
end
spec_helper.rb:
config.use_transactional_fixtures = false
Спецификация/поддержка/database_cleaner.rb:
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = :transaction
end
config.before(:each, :js => true) do
DatabaseCleaner.strategy = :truncation
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
У меня были блокировки транзакций, но добавление блока :js => true
к database_cleaner.rb
сделало это для меня.