2012-06-05 42 views
16

通常情況下,你測試,如果一個異常被拋出某種方法,如下所示。 我用FluentAssertions有沒有更適合測試構造函數是否拋出異常?

[Fact] 
public void Exception_gets_thrown() 
{ 
    // Arrange 
    var foo = new Foo("validArgument"); 

    // Act/Assert 
    foo.Invoking(f => f.Bar(null))   // null is an invalid argument 
     .ShouldThrow<ArgumentNullException>(); 
} 

但是如何測試,如果有異常被在構造函數拋出? 我只是這樣做,但是有沒有更合適的方法 通過FluentAssertions

[Fact] 
public void Constructor_throws_Exception() 
{ 
    // Arrange 
    Action a =() => new Foo(null);   // null is an invalid argument 

    // Act/Assert 
    a.ShouldThrow<ArgumentNullException>(); 
} 
+2

我不知道庫,但我喜歡你所做的 –

回答

13

這正是你應該如何測試例外,這就是ShouldThrow<T>()ShouldNotThrow<T>()被設計爲在首位。實際上,Invoking()方法在下一個大版本(2.0.0)中可能會被標記爲過時。

+0

但它是檢驗正確的方式,如果有什麼在構造函數中拋出異常?通過這個動作? –

+1

過時使用Invoking()方法。我發現它比上面第二個測試中顯示的Action機制更容易閱讀。調用可以讓所有事情都很好地結合在一起,所以意圖很明顯。 –

+0

@ebeen當測試從構造函數拋出的異常時,我通常只使用[ExpectedException(typeof(ArgumentNullException))]。考慮到測試中只有一行,只能從那裏拋出異常。 –

0

我增加了一個輔助方法,如下面的使用進行測試時構造函數:

static Action Constructor<T>(Func<T> func) 
{ 
    return() => func(); 
} 

然後我用這樣的:

Constructor(() => new Foo("bar", null)) 
.ShouldThrow<ArgumentNullException>() 
.And 
.ParamName 
.Should() 
.Be("baz"); 

我知道這是個人喜好的問題,但我發現這比需要首先聲明和分配委託更清潔一點。

這將使在原來問題的代碼如下所示:

[Fact] 
public void Constructor_throws_Exception() 
{  
    // Act/Assert 
    Constructor(() => new Foo(null)).ShouldThrow<ArgumentNullException>(); 
} 
相關問題