DatabaseCleaner.start настроен в блоке Rspec.config.before(:each)
, но выполняется после «до» тестовых блоков, это приводит к ошибкам дублирования в тестах
У меня есть в rails_helper.rb
RSpec.configure do |config|
...
config.before(:each) do
puts 'database cleaner start'
DatabaseCleaner.start
end
config.before(:each) do
puts 'database cleaner clean'
DatabaseCleaner.start
end
...
end
в тесте:
let(:account) { FactoryBot.create(:account) }
before do
puts "before test"
# use of account => duplicated errors
end
scenario 'some example' do
puts 'some expectations 1'
...
end
scenario 'some example' do
puts 'some expectations 2'
...
end
и результат равен
до теста
запуск очистителя базы данных
некоторые ожидания 1
очиститель базы данных clean
до испытания
запуск очистителя базы данных
некоторые ожидания 2
очиститель базы данных чистит
Это приводит к ошибкам дублирования в блоке before
«некоторых ожиданий 2», поскольку «до проверки»использует account
и, как я вижу, последний DatabaseCleaner.clean не очищается.
Есть способ инвертировать этот порядок?, так что нет необходимости добавлять sequences
вFactoryBot
Я бы хотелsult
запуск очистителя базы данных
до теста
некоторые ожидания 1
очиститель базы данных чистится
запуск очистителя базы данных
до испытания
некоторые ожидания 2
очиститель базы данных очистить
Возможное решение - изменить стратегию:
config.before(:each, type: :feature) do
DatabaseCleaner.strategy = :truncation
end
но
Как говорится документация , transaction
стратегиябыстрее
Я не могу понять, почему с transaction
не работает стратегия, на самом деле не удаляются данные?
Концептуально,Я предпочел бы очистить данные, прежде чем делать что-либо