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 回答
0

有一个内置的。

FluentActions.Invoking(() => new Foo(null)).ShouldThrow<ArgumentNullException>();
于 2021-05-31T05:25:33.180 回答