2013-03-09 39 views
6

以下是集成測試用例,其中帶有水豚3.2.12。 click_link 'New Log'是ajax調用。然而,打開的頁面以$()開頭,並且有一堆js像\ n和\ log-log一樣轉義。帶水豚的集成測試錯誤,用於帶導軌的ajax調用3.2.12

it "should work with link on show customer_comm_record page" do 
     visit customer_customer_comm_records_path(@cust) 
     #visit customer_customer_comm_record_path(@cust, @crecord) 
     click_link @crecord.id.to_s  
     click_link 'New Log' 
     save_and_open_page 
end 

我們也試圖與describe "", :js => true do包裹的情況下,如何有一個錯誤說

`An error occurred in an after hook ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked:` 

沒有錯誤了代碼執行。 rspec案件有什麼問題?感謝幫助。

+0

當您看到此消息時,是否打開Rails控制檯? – 2013-03-09 05:56:51

+0

我沒有試過導軌控制檯。是否有新的從軌道控制檯的錯誤? – user938363 2013-03-09 16:56:01

+1

請參閱http://stackoverflow.com/questions/6165889/database-is-locked – 2013-03-09 17:45:31

回答

8

它看起來像您的服務器正在鎖定數據庫,以便測試運行後無法清理。

當您在沒有JavaScript的情況下使用Capybara時,測試和服務器都運行在一個進程和線程中。這意味着他們可以共享相同的數據庫連接和事務。這意味着RSpec可以使用簡單的數據庫事務在測試結束時回滾更改,以及爲什麼在測試和服務器之間看不到任何鎖爭用。

當您使用:js => true運行時,情況會有所不同,服務器會在單獨的線程或進程中啓動到您的測試,因此它們將分別使用單獨的數據庫連接和事務。這意味着RSpec默認使用的數據庫事務策略無法進行清理。它也會導致你的情況發生鎖定錯誤。

水豚readme談論這個問題,並建議database_cleaner寶石作爲替代在這種情況下。您需要將數據庫清理程序配置爲使用截斷策略而不是事務

+0

請參閱http://devblog.avdi.org/2012/08/31/configuring-database_cleaner-with-rails-rspec-capybara-and-selenium/上的詳細說明 – John 2014-10-20 21:46:14