在“之前”测试块之后执行在Rspec.config.before中配置的DatabaseCleaner.start:复制错误

时间:2019-02-06 11:41:51

标签: rspec-rails database-cleaner

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策略不起作用,不是真的删除数据吗?

  • 从概念上讲,我希望在执行任何操作之前先清理数据

0 个答案:

没有答案