我正在测试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的新手,所以我猜测还有一些我需要做的事情或者我需要改变的事情。
答案 0 :(得分:1)
#click_button
不等待点击按钮的结果,因为它不知道那些将是什么。因此,在这种情况下#click_button
立即返回,测试结束,无论您在测试之间使用什么来清理数据库(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