Ошибка входа в систему при тестировании на Capybara, Rspec и Selenium в Rails 3.1 - PullRequest
16 голосов
/ 09 января 2012

Я добавил несколько диалоговых окон подтверждения для моего приложения на Rails 3.1 и, до этого, соответствующие тесты. Следуя модели Railscast # 257 , я добавил в тест ': js => true', добавил database_cleaner и соответственно изменил файл spec_helper.rb.

Когда я запускаю тест, Firefox запускается, Capybara-Selenium заполняет поля соответствующим именем пользователя и паролем, но вход в систему завершается неудачно (т. Е. «Неверное имя пользователя / пароль».) Другие тесты, которые не имеют : js => true 'и также войдите, все равно пройти.

Я хотел бы добавить больше JavaScript в свое приложение в будущем, и я избегаю решений, которые взломали бы Capybara, чтобы заставить это работать (например, нажмите «ОК» во всех диалоговых окнах).

Есть идеи, чего мне не хватает? Сбой, какие-либо предложения о том, как отладить эту проблему?

Спасибо.

Ответы [ 2 ]

14 голосов
/ 16 января 2012

Вы должны установить use_transactional_fixtures = false для ваших тестов селена.Это можно сделать в 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

Это происходит потому, чтоСелен-тесты обращаются к базе данных по-другому.При включенных фиксациях транзакций селен будет работать с пустой базой данных -> ваш пользователь не существует и вы не можете войти в систему.

Для обычных тестов вы должны использовать фиксации транзакций, потому что ваши тесты выполняются намного быстрее.

9 голосов
/ 03 января 2014

Согласно посту Авди Гримм (с подробным объяснением):

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 сделало это для меня.

...