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

Sam*_*vis 144 c# nunit unit-testing assert exception

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

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

[ExpectedException(typeof(Exception))]
Run Code Online (Sandbox Code Playgroud)

哪个最好?有人提供优势吗?或者仅仅是个人偏好的问题?

Ale*_*iuk 251

主要区别是:

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

NUnit 3.0 ExpectedException完全放弃了官方支持.

所以,我绝对更喜欢使用Assert.Throws()方法而不是ExpectedException()属性.

  • 这是迄今为止正确的答案.顺便说一句,Assert.Throws()也返回异常,如果它们对您很重要,它可以允许额外检查异常的属性. (7认同)
  • 这是链接https://github.com/nunit/docs/wiki/Breaking-Changes - 不再支持ExpectedExceptionAttribute. (2认同)

chu*_*e x 88

第一个允许您通过多个调用测试多个异常:

Assert.Throws(()=>MethodThatThrows());
Assert.Throws(()=>Method2ThatThrows());
Run Code Online (Sandbox Code Playgroud)

第二个只允许您测试每个测试函数的一个异常.

  • 测试应该只测试一个不同的逻辑位,所以不会在同一个单元测试中测试两个错误被认为是不好的做法吗? (24认同)
  • @SamuelDavis - 一般来说,你不想在同一个测试中测试不同的情况.但是,多个`Assert.Throws`可能有一些用例. (5认同)
  • 无论哪种方式,这里都会将异常作为参数获取,它允许您在异常中断言详细信息.此外,使用"预期异常"不会保护您在另一个方法调用中抛出相同的异常类型.在这里,您的目标是确切的方法,而不是整个测试.即使你的测试应该调用非常少的代码,你也永远不会太安全.特别是当代码变得复杂和/或异常太通用时.像"ArgumentNullExceptions"这样的东西可能会被抛出很多,例如使用ExpectedException很容易错过.Assert.Throws不会错过它. (3认同)

Mik*_*ill 35

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

    [Test]
    [Category("Slow")]
    public void IsValidLogFileName_nullFileName_ThrowsExcpetion()
    {
        // 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");

    }
Run Code Online (Sandbox Code Playgroud)


Rev*_*nks 10

您也可以强力键入您期望的错误(如旧的attrib版本).

Assert.Throws<System.InvalidOperationException>(() => breakingAction())
Run Code Online (Sandbox Code Playgroud)