2012-06-05 12 views
16

通常、あるメソッドで例外がスローされた場合は、次のようにテストします。例外がコンストラクタでスローされます場合は、コンストラクタが例外をスローするかどうかテストするのに適していますか?

[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を使うのか? 私はこれを好きにしましたが、より適切な方法があるでしょう via FluentAssertions

あなたは例外をテストすることになっていると、それは ShouldThrow<T>()ShouldNotThrow<T>()が最初の場所でのために設計されたものです正確にどのようにだ
[Fact] 
public void Constructor_throws_Exception() 
{ 
    // Arrange 
    Action a =() => new Foo(null);   // null is an invalid argument 

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

私は図書館を知らないが、私はあなたが –

答えて

13

。実際、Invoking()のアプローチは、次の大きなバージョン(2.0.0)では廃止とマークされる可能性があります。

+0

をやったようですが、それはテストするための正しい方法である、とします。これは、元の問題のコードは次のように見えてしまい

コンストラクタで例外がスローされますか?このアクションを経由しますか? –

+1

Invoking()アプローチを廃止したことに対する恥。上記の2番目のテストで表示されたアクションメカニズムよりも読みやすくなっています。呼び出しはすべてのものをうまくまとめ、インテントが明白であるようにします。 –

+0

@ebeen私は通常、コンストラクタからスローされた例外をテストするときに[ExpectedException(typeof(ArgumentNullException))]を使用します。テストに1行しかないとすれば、そこから例外をスローすることができます。 –

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>(); 
} 
関連する問題