Проблема с базой данных Cleaner с веб-сайтом Capybara

Я использую Cucumber для написания тестов интеграции и "Очиститель баз данных" , чтобы сохранить мой db в чистоте. Все отлично работает, так как мои тесты не требуют Javascript.

Я могу выполнить эти последние тесты, используя Capybara webkit, но тогда мой db не очищается вообще.

Вот мой файл features/support/env.rb:

require 'simplecov'
SimpleCov.start 'rails'
require 'cucumber/rails'

Capybara.default_selector = :css
Capybara.javascript_driver = :webkit

begin
  require 'database_cleaner'
  require 'database_cleaner/cucumber'
  DatabaseCleaner[:active_record].strategy = :transaction
rescue NameError
  raise "You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it."
end


Before do
  DatabaseCleaner.start
end

After do |scenario|
  DatabaseCleaner.clean
end

Я попробовал что-то похожее на this, чтобы проверить, какой драйвер используется Capybara, но он не работает. Я также попробовал взломацию, упомянутую в третьей части этот пост, но затем ничего не работало вообще...

Я действительно не знаю, как достичь этого, и любая помощь будет очень признательна.

Спасибо заранее.

Ответ 1

Быстрый ответ:

Настройте тесты JavaScript для использования усечения вместо транзакций:

DatabaseCleaner.strategy = :truncation

Более подробное объяснение:

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

Вот базовая схема процесса:

  • Capybara загружает ваше приложение в стойку, используя webrick или тонкий в фоновом потоке.
  • Основной поток устанавливает драйвер, предоставляя порт, на котором запущено приложение стойки.
  • В ваших тестах попросите водителя взаимодействовать с приложением, что заставляет фальшивый веб-браузер выполнять запросы против вашего приложения.

Это необходимо, потому что сложно создать поддельный браузер, который выполняет запросы против приложения Rack в памяти. В некоторых драйверах баз данных небезопасно выполнять запросы из нескольких потоков по той же транзакции.

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

Вы можете настроить RSpec (или Cucumber) на использование транзакций для всего, кроме тестов JavaScript. Это будет быстрее для тестов без JavaScript, все еще работающих на тестах JavaScript.

Avdi Grimm имеет хорошее сообщение в блоге по этому вопросу, в котором подробно описывается решение: http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/

Ответ 2

Начальные операции, основанные на транзакциях, не работают с огурцом. Причина этого в том, что у вас есть два отдельных процесса: один запускает ваш сервер приложений, а другой выполняет фактические запросы. Вокруг этого есть разные способы, но они грязные хаки. Чистым решением является использование усечения в качестве стратегии DatabaseCleaner.

DatabaseCleaner.strategy = :truncation

Before do
  DatabaseCleaner.clean_with :truncation
end