2010-07-02 37 views
1

我想斷言拋出異常,然後檢查拋出的異常的一些屬性。NUnit - 聲明異常和屬性

我的印象是,我可以做類似在以下:

ICommand command = CreateCommandObj(); 
Assert.That(() => command.DoWork(), Throws.TypeOf<ArgumentException>(),       
        Has.Property("ParamName").EqualTo("myParam") & 
Has.Property("Message").EqualTo("myMessage")); 

然而,這並不甚至編譯和看的Assert.That預期的參數,我不能看到我會怎樣能夠做到這一點?我敢肯定,我之前雖然用過這個...

注意上面是一個人爲的例子來說明這一點,忽略了我在尋找一個方法一個ArgumentException只是任何參數,這並不事實:)

任何幫助表示讚賞。

1)不能將lambda表達式轉換爲類型'object',因爲它不是委託類型。

回答

7

好的,已排序。

我需要使用的語法如下:

ICommand command = CreateCommandObj(); 
Assert.That(() => command.DoWork(), 
        Throws.TypeOf<ArgumentException>() 
        .And.Message.Equals("MyMessage")); 

這種方法可以讓我去檢查拋出的異常性。我可以在Assert中添加任意數量的And或Or's。

謝謝大家的建議。

+1

這幾乎爲我工作,但我不得不改變約束爲'Throws.TypeOf ()。和.Message.StringMatching(「MyMessage」));'。我認爲這是由於這篇文章發佈後對NUnit框架所做的更改。 – robyaw 2014-03-20 14:00:51

0

嘗試& & - 邏輯和位運算符和

編輯

我認爲你正在尋找Assert.Throws如果您使用的約束接口。不知道你將如何斷言消息。我認爲舊樣式對於您要實現的內容更清晰:

try 
    { 
    command.DoWork(); 
    Assert.Fail("ArgumentException Expected"); 
    } 
    catch (ArgumentException e) 
    { 
    Assert.AreEqual("Expected Message", e.Message); 
    } 
+0

嘗試過,但相同的編譯問題。我想我正在混合一些東西,因爲我看不到一個Assert.That方法超載,這將允許我做我想做的事情。 將編譯錯誤消息添加到問題。 – 2010-07-02 11:04:43

1

您可以在方法上測試[ExpectedException]屬性的例外情況。例如

[Test] 
[ExpectedException(typeof(InvalidOperationException))] 
public void Test_SomeMethod() 
{ 
    something.SomeMehthod(); 
} 

您可以在ExpectedException屬性的構造函數中設置預期異常的屬性。

編輯 你也可以指定你的測試屬性,如下列:

[Test] 
[ExpectedException(ExpectedException = typeof(InvalidOperationException), ExpectedMessage = "Somethings not right")] 
public void Test_SomeMethond() 
{ 
    something.SomeMehthod(); 
} 
+0

Is ExpectedException異常斷言的過時方法? 我認爲這已被Assert.Throws <>或使用Constraint語法取代? – 2010-07-02 11:33:50

+0

也許,這只是我一直這樣做的方式。 – 2010-07-02 11:55:59

+0

我想最終應該是哪個方法最好保持可讀性和與測試的一致性。 我想這可能會被認爲是由於較少的代碼行,您建議的方式更好。它的確是可讀性和易於理解的! – 2010-07-02 12:08:03