ruby-on-rails - SQLite3 :Busy exception with Capybara/Poltergeist

标签 ruby-on-rails sqlite capybara poltergeist

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

我的测试套件使用带有 Capybara 和 Poltergeist 的 Minitest 作为驱动程序。我的 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 应用程序 stub 用户访问级别登录,然后简单地访问该路由。

但是,它在我使用的“用户访问 stub ”方法上失败了。看起来像 Core::User.any_instance.stubs(etc...) ,它只是返回一个用户模型。

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

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

由于我使用固定装置,这可能是一个数据库清理问题(我现在不使用它,因为我目前只使用预先创建的固定装置)我从未将数据库清理与 minitest 一起使用,因为我只熟悉将它与 rspec 一起使用还有工厂女孩。

最佳答案

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

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

关于ruby-on-rails - SQLite3 :Busy exception with Capybara/Poltergeist,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44662005/

相关文章:

javascript - 如何在没有浏览器的机器上运行 cucumber 以及 Selenium 和 capybara ?

ruby-on-rails - 设计不生成注册路径/路线

html - 如何使用 Rspec 检查 HTML 片段是否有效?

android - Android 中使用多个数据库表时的代码设计

ruby-on-rails - 在 RSpec 请求规范中使用 Capybara 时,设置自定义请求 header 的最佳方法是什么?

ruby-on-rails - Rails : Delete request in capybara, 错误还是我的错误?

ruby-on-rails - rails : ActiveRecord query based on association value

python - 从 Rails 运行 Python 解释器

ruby-on-rails - Windows/Ruby/Rails 安装 --- .cannot load such file -- sqlite3/sqlite3_native windows

c# - SaveChanges 获取旧值后 Entity Framework 读取