我正在测试javascript,尝试通过ajax表单将数据提交给DB时收到以下错误。
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
将立即返回,测试结束,并且您在两次测试之间用于清理数据库的任何内容(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-策略最快
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句