Ошибка входа при тестировании с помощью 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 сделало это для меня.