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
数据库清洁器清理
测试前
数据库清理器启动
一些期望2
数据库清洁器清理
这会在“一些期望2”的before
块中导致重复错误,因为“测试前”使用的是account
,并且正如我所看到的,最后一个DatabaseCleaner.clean不干净。
有一种方法可以反转此顺序吗?,因此不必在FactoryBot中添加sequences
我想要结果
数据库清理器启动
测试前
一些期望1
数据库清洁器清理
数据库清理器启动
测试前
一些期望2
数据库清洁器清理
可能的解决方案是更改策略:
config.before(:each, type: :feature) do
DatabaseCleaner.strategy = :truncation
end
但是
正如documentation所说,transaction
策略更快
我不明白为什么使用transaction
策略不起作用,不是真的删除数据吗?
从概念上讲,我希望在执行任何操作之前先清理数据