使用 NUnit Assert.Throws 方法还是 ExpectedException 属性?

我发现这些似乎是测试异常的两种主要方法:

Assert.Throws<Exception>(()=>MethodThatThrows());


[ExpectedException(typeof(Exception))]

哪一个最好?一个比另一个有优势吗?还是仅仅是个人偏好的问题?

81076 次浏览

第一种方法允许您测试多个异常,包括多个调用:

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());

第二种方法只允许对每个测试函数测试一个异常。

我更喜欢 assert.throw,因为它允许我在抛出异常之后验证和断言其他条件。

    [Test]
[Category("Slow")]
public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
{
var a = new MyTestObject();


// the exception we expect thrown from the IsValidFileName method
var ex = Assert.Throws<ArgumentNullException>(() => a.IsValidLogFileName(""));


// now we can test the exception itself
Assert.That(ex.Message == "Blah");


}

主要区别在于:

如果在测试方法中的 任何位置发生异常,则 ExpectedException()属性使测试通过。
使用 Assert.Throws()允许指定代码的 exact位置,其中预期有异常。

NUnit 3.0完全放弃了对 ExpectedException的官方支持。

因此,我肯定更喜欢使用 Assert.Throws()方法而不是 ExpectedException()属性。

您还可以强类型输入预期的错误(如旧的属性版本)。

Assert.Throws<System.InvalidOperationException>(() => breakingAction())

如果你使用的是 NUnit的旧版本(< = 2.0) ,那么你需要使用 ExpectedException

如果您使用的是 2.5或更高版本,那么您可以使用 Assert.Throw()

Https://github.com/nunit/docs/wiki/breaking-changes

使用方法: Https://www.nunit.org/index.php?p=exceptionasserts&r=2.5