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

时间:2016-02-13 03:48:36

标签: ruby-on-rails ruby-on-rails-4 capybara

我正在测试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的新手,所以我猜测还有一些我需要做的事情或者我需要改变的事情。

1 个答案:

答案 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