是否更适合测试构造函数是否抛出异常?

时间:2012-06-05 15:37:56

标签: c# .net unit-testing xunit.net fluent-assertions

通常,如果在某种方法中抛出异常,则进行测试,如下所示。 我使用 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>();
}

3 个答案:

答案 0 :(得分:16)

这正是你应该测试异常的方式,而这正是ShouldThrow<T>()ShouldNotThrow<T>()首先设计的内容。实际上,Invoking()方法可能会在下一个大版本(2.0.0)中被标记为过时。

答案 1 :(得分:1)

我在测试构造函数时添加了一个如下所示的辅助方法:

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>();
}

答案 2 :(得分:0)

有一个内置的。

FluentActions.Invoking(() => new Foo(null)).ShouldThrow<ArgumentNullException>();