25

通常、次のように、特定のメソッドで例外がスローされるかどうかをテストします。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>();
}
4

3 に答える 3

23

それがまさに例外をテストする方法であり、それShouldThrow<T>()ShouldNotThrow<T>()最初に設計されたものです。実際、このInvoking()アプローチは次の大きなバージョン (2.0.0) で廃止される可能性があります。

于 2012-06-05T17:31:12.253 に答える
3

コンストラクターをテストするときに使用するために、以下のようなヘルパー メソッドを追加しました。

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>();
}
于 2016-03-09T15:26:23.210 に答える