DatabaseCleaner引发NoMethodError:nil:NilClass的未定义方法“ rollback”

时间:2018-10-31 15:40:58

标签: ruby-on-rails ruby rspec database-cleaner

我有一个使用rspec并包含DatabseCleaner的Rails应用程序,以确保每个测试之间的测试数据库都是干净的。

DatabaseCleaner在我们的spec/rails_helper.rb中配置为

  config.before(:suite) do
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  config.around(:each) do |example|
    DatabaseCleaner.cleaning do
      example.run
    end
  end

我们一直在ci环境中看到间歇性错误,其中单个测试将失败

 1) LibraryHours Required fields Library Hour must have a location
 Failure/Error:
   DatabaseCleaner.cleaning do
     example.run
   end

 NoMethodError:
   undefined method `rollback' for nil:NilClass
 # ./spec/rails_helper.rb:66:in `block (2 levels) in <top (required)>'

我们无法使用rspec运行时的种子在本地重现错误,并且正在进行真正的故障调试。

1 个答案:

答案 0 :(得分:0)

因此,事实证明,一个开发人员(我)不了解rails_helper中的DatabaseCleaner调用已应用于所有规范,并向其中一个规范文件添加了DatabaseCleaner.clean的额外调用。删除附加项:

 after do
    DatabaseCleaner.clean
  end

解决了该问题。

我猜这是由于两次DatabaseCleaner.clean调用引起的竞争状态。