Ответ 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/