2016-02-13 59 views
0

我正在測試javascript,當我嘗試通過ajax表單提交數據到數據庫時,出現以下錯誤。水豚錯誤ActiveRecord :: StatementInvalid:SQLite3 :: BusyException:數據庫被鎖定

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

#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

+0

我有'assert_text'diablo'' 'click_button'將文字diablo添加到使用ajax刷新的div中以顯示新添加的鍵(在表單提交後刷新),我想我需要擴展出現文本的限制。 – Rob

+1

如果assert_text沒有引發錯誤,那麼您不需要延長查看文本的時間。從您的描述中可以看出,在ajax調用之前或者在完成ajax調用之前,文本'diablo'被添加到了div中。如果前者(或者頁面上已經存在其他「暗黑破壞神」實例),那麼檢查並不是一個好的改變。 –

+1

你需要檢查一些表明ajax已經完成的東西(因此也完成了數據庫訪問) - 例如,如果ajax添加了一個class'key'的div,並且你知道屏幕上有2個以前可以執行' assert_selector'div.key',count:3'這將等待那裏有3個'關鍵'divs - 如果你需要更多的信息 - 更新你的問題來完成你正在使用的全面測試,也許增加一些html –