2017-06-20 77 views
1

所以即時運行SQLite並試圖使用燈具加載正確的數據顯示和測試通過與水豚瀏覽器。SQLite3:繁忙的例外與水豚/ Poltergeist

我的測試套件爲驅動程序使用Minitest w/Capybara和Poltergeist。我test_helper.rb文件的相關部分看起來像這樣:

require "minitest/reporters" 
reporters = [] 
reporters << Minitest::Reporters::SpecReporter.new 
Minitest::Reporters.use! reporters, ENV, Minitest.backtrace_filter 

require "minitest/rails/capybara" 
Capybara.register_driver :poltergeist do |app| 
    Capybara::Poltergeist::Driver.new(app, :js_errors => false) 
end 
Capybara.default_driver = :poltergeist 
Capybara.current_driver = :poltergeist 
Capybara.javascript_driver = :poltergeist 

但是我有一個簡單的測試,存根用戶訪問級別登錄因爲這是上運行的Web應用程序,然後簡單地參觀路線。

然而,它似乎是我使用的「用戶訪問存根」方法失敗。看起來像Core::User.any_instance.stubs(etc...)這只是返回一個用戶模型。

不管怎麼說確切的錯誤我得到的是:

ActiveRecord::StatementInvalid:   ActiveRecord::StatementInvalid: SQLite3::BusyException: database is locked: commit transaction 

由於IM使用夾具將這個也許是一個DB清潔問題(我不是現在使用它作爲我只是在使用預先創建燈具目前)我」我從來沒有使用DB清潔劑與微型,因爲我只熟悉與rspec和工廠女孩使用它。

回答

1

錯誤告訴你,另一個數據庫連接已經有sqlite可以寫入(它可以處理多個讀取器,但一次只能有一個寫入器)。你不會顯示你的實際測試或你的存根,所以你不可能特別說明你的問題在哪裏,但是你有提出請求的可能性,然後在發生的時候運行一些其他數據庫訪問(例如,你是否預先加載了對象存根會返回,還是在存根被執行時被加載?)。

如果您的應用程序不使用sqlite作爲數據庫,那麼切換到測試數據庫應用程序將在生產中使用。另外,在功能測試中,存根是一種反模式,您應該創建適當的記錄並處理它們。

+0

我希望我可以發佈代碼,但因爲它是工作代碼......我不能。事情是,雖然測試只是打開一個頁面並加載用戶,而另一個測試成功。然而,另一個測試只是使用minitest和用戶代理,'紅寶石'page.driver與水豚。而我正在用水豚使用poltergeist。 – msmith1114

+0

@ msmith1114我不明白'cap.dara與pagebdriver'是什麼意思,如果你的意思是它使用racktest驅動程序,那麼這是一個巨大的差異,因爲它全部在同一個線程中運行 - 因此只有一個數據庫連接。當使用poltergeist時,至少有2個線程(測試,應用程序)並且可能更多,當頁面加載和多個數據庫連接時可以有多個請求。如果你的應用程序實際上並沒有在生產交換中使用sqlite來測試你在生產中使用的任何東西,那麼你將有一個更容易的時間。 –

+0

問題是我們的產品數據庫是一個非常古老的SQL-Server版本,因此數據庫清潔工程師將無法使用,因此每次都要回到一個乾淨的版本基本上是不可能的。有沒有辦法解決這個sqlite問題?或者我現在只需要堅持使用基於非瀏覽器的測試。和它說它使用的驅動程序(別人寫這記得)被設置爲:'page.driver.header('User-Agent','Ruby')'這即時猜測意味着它使用機架驅動程序 – msmith1114