水豚错误 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
我正在测试 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