【问题标题】:DatabaseCleaner raising NoMethodError: undefined method `rollback' for nil:NilClassDatabaseCleaner 引发 NoMethodError:nil:NilClass 的未定义方法“回滚”
【发布时间】:2018-10-31 15:40:57
【问题描述】:

我有一个使用 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 运行的种子在本地重现错误,并且在调试时遇到了真正的麻烦。

【问题讨论】:

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


    【解决方案1】:

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

     after do
        DatabaseCleaner.clean
      end
    

    修复了问题。

    我猜这是由DatabaseCleaner.clean 的两次调用引起的竞争条件。

    【讨论】:

    • 最大的问题是,为什么它修复了错误?我正在使用主动存储,这是我第一次遇到这种情况。不确定问题是否相关,但最好知道“为什么”而不是猜测。
    猜你喜欢
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多