是否有更合适的方法来测试构造函数是否引发异常
本文关键字:是否 测试 构造函数 异常 方法 | 更新日期: 2023-09-27 18:36:22
通常,如果某个方法中抛出异常,则进行测试,如下所示。我使用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>();
}
但是,如果构造函数中抛出异常,如何测试?我只是这样做的,但是也许有更合适的方法通过流利断言?
[Fact]
public void Constructor_throws_Exception()
{
// Arrange
Action a = () => new Foo(null); // null is an invalid argument
// Act/Assert
a.ShouldThrow<ArgumentNullException>();
}
这正是你应该测试异常的方式,这就是ShouldThrow<T>()
和ShouldNotThrow<T>()
最初设计的目的。事实上,Invoking()
方法可能会在下一个大版本 (2.0.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>();
}
有一个内置的。
FluentActions.Invoking(() => new Foo(null)).ShouldThrow<ArgumentNullException>();