2013-10-08 60 views
1

如何告訴QUnit在asyncTest期間將錯誤視爲測試失敗並繼續進行下一個測試?QUYNit asyncTest在錯誤後不會繼續

這裏是QUnit停止一個ReferenceError後運行一個例子:jsfiddle

+0

我可以使用'testTimeouts',但它有風險,因爲測試可能需要很多時間,並且如果您有一些錯誤測試,它將花費很多時間來運行所有測試! – Bakhshi

回答

1

錯誤異步測試中默默死去,如果出現而QUnit沒有正式運行他們。

最簡單的解決方案是將每個asyncTest內容封裝在try/catch塊中,該塊在傳播任何錯誤之後重新啓動QUnit。實際上,我們實際上不得不污染具有一百萬次嘗試/捕獲的代碼 - 我們可以自動裝飾您現有的方法。

例如:

// surrounds any function with a try/catch block to propagate errors to QUnit when 
// called during an asyncTest 
function asyncTrier(method) { 
    return function() { 
     try{ 
      // if the method runs normally, great! 
      method(); 
     } catch (e) { 
      // if not, restart QUnit and pass the error on 
      QUnit.start(); 
      throw new (e); 
     } 
    }; 
} 

QUnit.asyncTest("sample", 1, function() { 
     setTimeout(asyncTrier(function(){ 
      var foo = window.nonexistentobj.toString() + ""; // throws error 

      QUnit.ok("foo defined", !!foo) 
      QUnit.start(); 
     }), 1000); 
}); 

分叉的小提琴,與樣品包裝方法自動應用這樣一個try/catch周圍的每一個異步塊:http://jsfiddle.net/bnMWd/4/

編輯:每評論更新。 )

+0

謝謝,但仍然有問題,'QUnit'會認爲我的測試在調用'start'後已經完成。這會導致錯誤的輸出,如果你運行一個自動化測試(例如業力),他們不會知道你還有測試運行,並且會在你最後一次「開始」之後結束你的測試會話。這裏是你的代碼的更新:http://jsfiddle.net/bakhshi/bnMWd/2/ – Bakhshi

+0

啊哈!新的解決方案 - 更詳細一點(需要包裝每個超時塊),但傳播錯誤,仍然可讀。 – mjk