SQLite3:Busy 异常 Capybara/Poltergeist

SQLite3:Busy exception with Capybara/Poltergeist

所以我 运行 SQLite 并尝试使用固定装置加载正确的数据以使用水豚通过浏览器显示和测试。

我的测试套件使用 Minitest w/Capybara 和 Poltergeist 作为驱动程序。我的 test_helper.rb 文件的相关部分如下所示:

require "minitest/reporters"
reporters = []
reporters << Minitest::Reporters::SpecReporter.new
Minitest::Reporters.use! reporters, ENV, Minitest.backtrace_filter

require "minitest/rails/capybara"
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, :js_errors => false)
end
Capybara.default_driver = :poltergeist
Capybara.current_driver = :poltergeist
Capybara.javascript_driver = :poltergeist

但是我有一个简单的测试,它为 运行 所在的 Web 应用程序存根用户访问级别登录,然后简单地访问该路由。

然而,它似乎在我使用的 "User Access Stubbing" 方法上失败了。看起来像 Core::User.any_instance.stubs(etc...) 只是返回一个用户模型。

无论如何,我得到的确切错误是:

ActiveRecord::StatementInvalid:         ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: commit transaction

因为我正在使用 fixtures 这可能是一个 DB cleaner 问题(我现在没有使用它因为我目前只使用预先创建的 fixtures)我从来没有使用 DB cleaner with minitest 因为我只熟悉使用它与 rspec 和工厂女郎。

错误告诉您另一个数据库连接已经打开了 sqlite 用于写入(它可以处理多个读取器,但一次只能处理一个写入器)。您没有显示您的实际测试或存根,因此无法具体说明您的问题出在哪里,但很可能您已经提出请求,然后 运行 一些其他数据库访问正在发生(例如有您预加载了存根 returns 的对象,还是在执行存根时加载了对象?)。

如果您的应用不使用 sqlite 作为其数据库,则切换到在应用将在生产中使用的数据库上进行测试。此外,存根是功能测试中的反模式,您应该只创建适当的记录并处理它们。