Capybara + Selemium: как инициализировать базу данных в тестовом коде интеграции и сделать ее видимой в приложении Rails?

Конфигурация: Интеграционные тесты для проекта Rails с использованием RSpec, Capybara, драйвера Selemium, базы данных SQLite.

Ситуация: У меня было несколько тестов интеграции с Capybara и драйвером rack_test по умолчанию. Они создают регистрацию пользователя (для Devise gem) непосредственно в базе данных. Затем они заходят в систему и тестируют сценарий с использованием Capybara DSL, как это сделал бы пользователь.

Проблема: Я попытался изменить драйвер на Selenium, чтобы проверить код JavaScript. Теперь тесты терпят неудачу, потому что приложение не видит регистрации пользователя, что созданные тесты.

Исследование: Похоже, что драйвер Selenium работает по-разному с трансациями, поэтому изменения, сделанные в тесте, невидимы в веб-приложении. Возможное решение:

config.use_transactional_fixtures = false 
DatabaseCleaner.strategy = :truncation

Ответы

Ответ 1

Для меня создано решение от здесь и здесь:

  • добавить в Gemfile gem database_cleaner
  • создать файл spec/support/javascript.rb с контентом

`

RSpec.configure do |config|

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with :truncation
  end

  config.before(:each) do
    if example.metadata[:js]
      Capybara.current_driver = :selenium
      DatabaseCleaner.strategy = :truncation
    else
      DatabaseCleaner.strategy = :transaction
      DatabaseCleaner.start
    end
  end

  config.after(:each) do
    Capybara.use_default_driver if example.metadata[:js]
    DatabaseCleaner.clean
  end
end

`

хотя он вызвал небольшой штраф для моего времени выполнения contoller и model specs (от 40 до 43 секунд).