水豚错误 ActiveRecord::StatementInvalid: SQLite3::BusyException: 数据库被锁定

Capybara error ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked

我正在测试 javascript,当我尝试通过 ajax 表单向数据库提交数据时出现以下错误。

ActiveRecord::StatementInvalid:         ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: INSERT INTO "check_category_item_keys" ("name", "key_type", "created_at", "updated_at") VALUES (?, ?, ?, ?)

这是我的集成测试文件

require 'test_helper'

class JavascriptTestingTest < ActionDispatch::IntegrationTest

setup do
    @user = users(:michael)
    @user1 = users(:archer)
    @guide = Guide.find(1)
    @mod_relationship = game_mods_relationships(:mod1)
    @category = Category.find(1)
    Capybara.current_driver = Capybara.javascript_driver # :selenium by default
  end


test "adding keys mod success then fail" do
  log_in_as(@user)
  visit(edit_guide_category_path(@guide, @category))
  itemkeycount = CategoryItemKey.count
  fill_in 'Key name', with: "diablo"
  click_button "Add New Key"  #works fine when this line is removed
end

我是测试 JS 的新手,所以我猜我还需要做一些事情或需要更改一些事情。

#click_button 不会等待单击按钮的结果发生,因为它不知道这些结果会是什么。因此,在这种情况下 #click_button returns 立即,测试结束,无论您在测试之间使用什么来清理数据库(DatabaseCleaner??)都会开始清理数据库。在此期间,由 click_button 触发的请求开始得到处理,但清理线程已经锁定了数据库(或反之亦然),因此您会收到错误消息。解决方案是有一条线等待任何点击按钮的可见副作用。

fill_in 'Key name', with: "diablo"
click_button "Add New Key"
assert_text "New Key Added!" # or whatever shows up the page

assert_text 将等待(达到一定限度)该文本出现,这意味着数据库不再使用,测试可以完成并且可以进行清理。另一件需要注意的事情是您没有使用基于事务的测试,因为在使用支持 JS 的驱动程序进行测试时,这也会导致您出现各种问题 - 请参阅 https://github.com/DatabaseCleaner/database_cleaner#what-strategy-is-fastest