1., 2. & 4., Вы должны использовать транзакции (либо с use_transactional_fixtures
, либо с поддержкой транзакций из гема database_cleaner), если вы используете стандартный движок capybara - rack_test.Как вы заметили, использование транзакций значительно быстрее, чем использование стратегии усечения.Однако, когда записи в базу данных могут проходить через разные потоки (как с селеном), транзакции не будут работать.Поэтому вам нужно будет использовать усечение (или заставить все проходить через один поток БД - другой вариант).
3. Да, вы должны отключить use_transactional_fixtures
при использовании гем database_cleaner, поскольку он изначально поддерживает транзакции.Если вам нужны только транзакции, просто используйте use_transactional_fixtures и никогда не загружайте самоцвет database_cleaner.
5. Следующий код будет переключаться между :transaction
и :truncation
на лету.(Протестировано это с помощью rspec, capybara, rails3.)
Особенности Это должно дать вам лучшее из обоих миров. скорость из rack_test
, когда вам не нужно тестировать JavaScript, и гибкость из selenium
, когда вы это делаете.
Также этот код заботится о повторном заполнении данных семени в тех случаях, когда это необходимо (этот метод предполагает, что вы используете seed.rb для загрузки данных семени - как это принято в настоящее время).
Добавьте следующий код в spec_helper.
config.use_transactional_fixtures = false
RSpec.configure do |config|
config.before(:suite) do
require "#{Rails.root}/db/seeds.rb"
end
config.before :each do
if Capybara.current_driver == :rack_test
DatabaseCleaner.strategy = :transaction
else
DatabaseCleaner.strategy = :truncation
end
DatabaseCleaner.start
end
config.after(:each) do
if Capybara.current_driver == :rack_test
DatabaseCleaner.clean
else
DatabaseCleaner.clean
load "#{Rails.root}/db/seeds.rb"
end
end
end
Спасибо Джо Лисс за указание пути.
PS: Как переключать драйверы на лету
Приведенное выше решение предполагает, что вы уже знаете, как переключать драйверы на лету.В случае, если кто-то сюда не придет, вот как:
Как и выше, давайте предположим, что вы обычно будете использовать драйвер по умолчанию для capybara rack_test, но вам нужно будет использовать селен для тестирования некоторых вещей Ajaxy.Если вы хотите использовать драйвер селена, используйте :js => true
или @javascript
для Rspec или огурца соответственно.Например:
Пример Rspec:
describe "something Ajaxy", :js => true do
Пример огурца:
@javascript
Scenario: do something Ajaxy