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

时间:2013-02-21 23:52:45

标签: c# unit-testing exception nunit assert

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

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

[ExpectedException(typeof(Exception))]

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

5 个答案:

答案 0 :(得分:247)

主要区别在于:

如果在测试方法的任何位置发生异常,

ExpectedException()属性会通过测试。
Assert.Throws()的使用允许指定代码的exact位置。

NUnit 3.0完全取消对ExpectedException的官方支持。

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

答案 1 :(得分:84)

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

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

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

答案 2 :(得分: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");

    }

答案 3 :(得分:10)

你也可以强力输入你期望的错误(比如旧的attrib版本)。

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

答案 4 :(得分:0)

如果您使用<div class="row"> <div class= "col-md-6"> <div class="thumbnail"> <a target="_blank" href="http://codepen.io/gusd773/pen/YZExVE"> <img src="http://jumpoff.tv/assets/images/made/assets/images/posts/ready_to_die2_326_202_s_c1_center_top.jpg"></a> </div> </div> <div class= "col-md-6"> <div class="thumbnail"> <a target="_blank" href="http://codepen.io/gusd773/pen/YZExVE"> <img src="http://jumpoff.tv/assets/images/made/assets/images/posts/ready_to_die2_326_202_s_c1_center_top.jpg"></a> </div> </div> </div> </div> 的旧版本(&lt; = 2.0 ),则需要使用NUnit

如果您使用 2.5 或更高版本,则可以使用ExpectedException

https://github.com/nunit/docs/wiki/Breaking-Changes

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