2011-03-21 62 views

回答

24

我認爲這是正確的測試都異常類型和消息。並且兩者在xUnit中都很容易:

var exception = Assert.Throws<AuthenticationException>(() => DoSomething()); 
Assert.Equal(message, exception.Message); 
+1

Assert.Throws <>構造與異步方法一起工作嗎? – 2013-03-28 17:18:00

+2

@CsabaToth不,你需要Assert.ThrowsAsync <>來做到這一點 – jfmg 2016-01-18 12:53:47

+0

我敢肯定我錯過了顯而易見的,但第一行中的'message'參數是什麼? – 2017-04-28 13:08:08

0

異常與您測試的任何其他預期結果沒有什麼不同。測試消息是否正確是很自然的,因爲兩種不同的消息可能以相同的異常類型出現。但是 - 我個人認爲這不是強制性的,至少在所有例外情況下都是如此。

在我們的項目中的每個應用程序異常還附加了一個「消息」對象,所以我們驗證的MessageId只是,我們不驗證消息的論點是正確的或消息的文本。例如,如果消息文本是「提供了錯誤參數< {0}>」,那麼我們不檢查傳遞給格式{0}的參數是否如預期的那樣 - 這不是意圖。該消息具有唯一的ID - 因此,我們驗證了例外情況下的MessageID是'WRONG_PARAMETER_PROVIDED'。

1

xUnit使用Assert.Throws來測試異常類型。如果需要,您可以捕獲異常並根據消息聲明Assert。我認爲一般來說,你想測試預期的異常是否被拋出,並且確切的消息實際上並不是必需的。如果你有一個自定義異常,你是單元測試,你要確保所產生的信息是你所期望的

Assert.Throws<ArgumentNullException>() 

的例外可能是。或者,如果有相同的異常類型可以拋出兩種方式,但不同的消息,則斷言對消息將是有價值的

+0

'拋出()'返回異常 - 無需捕獲它。 – 2012-05-11 11:59:34

-1

xUnit網站也提到了「Record.Exception」結構。

0

最好使用Record.Exception方法,因爲它的AAA模式匹配:

[Fact] 
    public void Divide_TwoNumbers_ExpectException() 
    { 
     var sut = new Calculator(); 
     var exception = Record.Exception(() => sut.Divide(10, 0)); 
     Assert.IsType(typeof(DivideByZeroException), exception); 
    } 

希望這有助於...

0

像這樣的事情

var ex = Record.Exception(() => DoSomeThing()); 
Assert.IsType(typeof(ArgumentNullException), ex); 
Assert.True(ex.Message.Contains("Your exception message")); 
0

BTW,ReSharper的喜歡不要使用typeof,而是建議使用Assert.IsType,例如

var ex = Record.Exception(() => new FooController(null, null)); 
Assert.IsType<ArgumentNullException>(ex);