2012-11-08 35 views
10

考慮,做基礎上,論證了一些異常處理函數傳遞參數:你如何在Dart中單元測試異常?

List range(start, stop) { 
    if (start >= stop) { 
     throw new ArgumentError("start must be less than stop"); 
    } 
    // remainder of function 
} 

如何測試,正確類型的異常升高?

回答

23

在這種情況下,有各種方法來測試異常。爲了簡單的測試將引發異常:

expect(() => range(5, 5), throws); 

來測試異常的正確類型的提高:

expect(() => range(5, 2), throwsA(new isInstanceOf<ArgumentError>())); 

,以確保不發生異常:

expect(() => range(5, 10), returnsNormally); 

到測試異常類型和異常消息:

expect(() => range(5, 3), 
    throwsA(predicate((e) => e is ArgumentError && e.message == 'start must be less than stop'))); 

這裏是另一種方式來做到這一點:

expect(() => range(5, 3), 
    throwsA(allOf(isArgumentError, predicate((e) => e.message == 'start must be less than stop')))); 

(感謝格雷厄姆惠勒在谷歌的最後2個解決方案)。

+0

我是做'希望(範圍(5,3),throwsArgumentError )',但這個例外在預期內並沒有被捕獲。期望的第一個參數必須是一個匿名函數,當被調用時它最終會拋出。你的回答幫助我找到了那個愚蠢的錯誤,謝謝! – fgiraldeau

2

我喜歡這種方法:

test('when start > stop',() { 
    try { 
    range(5, 3); 
    } on ArgumentError catch(e) { 
    expect(e.message, 'start must be less than stop'); 
    return; 
    } 
    throw new ExpectException("Expected ArgumentError"); 
}); 
+0

這是比其他選項更詳細一些,但它是相當可讀的,它並不假定你已經記住了整個單元測試庫;) –

1

對於簡單的異常測試,我更喜歡用靜態方法API:

Expect.throws(
    // test condition 
(){ 
    throw new Exception('code I expect to throw'); 
    }, 
    // exception object inspection 
    (err) => err is Exception 
);