2016-03-04 75 views
0

如果完成時間超過n秒,我想要失敗(或繼續)RSpec測試。我正在使用這種方法來調試應用程序在測試期間拖延的位置。如何在n秒後失敗或繼續下一次RSpec測試?

  • 我需要在事務中包裝測試。我嘗試創建一個Timeout塊,但數據庫未被清理,並且線程仍處於打開狀態。也許database_cleaner可以幫助這裏...
  • 理想情況下,我想用一個自定義消息來代替水豚錯誤(見下文),如'Forced Timeout'

我知道把fail在測試,但只有它如果該行被讀取,則工作。相反,如果測試已經在同一條線上,例如10秒,我希望它移動到下一個測試,無論是通過失敗還是調用一些方法。

例豚失敗消息:

1) Exercise Login page - log in as user type 
    Failure/Error: fill_in "Username", with: @user.name 
    Capybara::ElementNotFound: 
    Unable to find field "Username" 
+0

你應該在測試中實現超時而不是在測試中,但不管什麼時候需要很長時間。所以如果你長時間運行,進程正在嘗試連接到某個東西,那麼你的HTTP客戶端(或者其他任何東西)應該測試它自己的超時。 – Anthony

+0

@安東尼我同意你的意見,但是在這一點上,我不確定要花多長時間。例如,我在午餐時間運行我的套房,但在2分鐘後進行了10次測試,結果停滯不前。在這種情況下,最後記錄的事情是'ROLLBACK' - 沒有什麼可以說Rollback崩潰了。 – onebree

+0

在做水豚規格時,您希望使用截斷而不是交易 - 尤其是在使用JavaScript驅動程序(如webkit或selenium)的情況下。 https://github.com/jnicklas/capybara#transactions-and-database-setup – max

回答

1

您可以結合使用一個RSpec各地鉤與Ruby的超時。 全球範圍內,您可以像這樣設置,但如果您知道哪一個是問題,您甚至可以在特定測試中進行設置。

require 'timeout' 
time_limit = n 

RSpec.configure do |c| 
    c.around(:each) do |example| 
    Timeout::timeout(time_limit) { 
     example.run 
    } 
    end 
end 
+0

我正在使用水豚,並試圖顯示沿「無法找到元素」,而不是'超時'或什麼的線。 – onebree

+0

更新 - 這不起作用,因爲它影響數據庫清理和線程。我會繼續尋找解決方案。 – onebree