使用NUnit测试任何类型的异常

时间:2012-03-27 11:12:00

标签: c# .net nunit

我有一个创建文件的类。

我现在正在进行集成测试以确保课程正常。

我传入的目录和文件名无效,以确保抛出异常。

在我的测试中,我正在使用:

[Test]
public void CreateFile_InvalidFileName_ThrowsException()
{
    //Arrange
    var logger = SetupLogger("?\\");

    //Act

    //Assert
    Assert.Throws<Exception>(()=> logger.CreateFile());
 }

但是在这种情况下,测试失败,因为抛出了ArgumentException。我想通过添加Exception它会通过。

有没有办法让这个传递只使用Exception?

7 个答案:

答案 0 :(得分:28)

Assert.Throws<>的帮助声明它“验证委托在调用时抛出特定类型的异常”

尝试Assert.That版本,因为它会捕获任何Exception

private class Thrower
{
    public void ThrowAE() { throw new ArgumentException(); }
}

[Test]
public void ThrowETest()
{
    var t = new Thrower();
    Assert.That(() => t.ThrowAE(), Throws.Exception);
}

答案 1 :(得分:6)

对于NUnit 2.5及以上

// Allow both ApplicationException and any derived type
Assert.Catch<ApplicationException>(() => logger.CreateFile());

// Allow any kind of exception
Assert.Catch(() => logger.CreateFile());

答案 2 :(得分:2)

您的异常应该是确定性的,并且您应该能够编写测试用例来设置抛出特定异常的条件,并且您应该测试该特定异常。

因此,您的测试应该重写为

CreateFile_InvalidFileName_ThrowsArgumentException

Assert.Throws<ArgumentException>(() => logger.CreateFile());

编辑:

顺便说一下,我认为你的构造函数应该检测无效的文件名并扔到那里。然后它应该是构造函数的合同,文件名是有效的。

答案 3 :(得分:1)

您可以使用属性ExpectedException标记测试方法。这应该有用。

   [ExpectedException(typeof(Exception))]
    public void TestException()
    {

    }

答案 4 :(得分:1)

一般来说,您应该只测试特定的例外情况,以确保您的代码能够正确响应不同的错误。

如果您确实需要为了测试而允许任何异常,只需使用标准的try / catch块和正常的成功/失败断言。

答案 5 :(得分:1)

编写自己的方法并将其用于验证。

/// <summary>
    /// Throwses the specified action.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="action">The action.</param>
    /// <returns></returns>
    public static T Throws<T>(Action action) where T : Exception
    {
        try
        {
            action();
        }
        catch (T ex)
        {
            return ex;
        }

        Assert.Fail("Expected exception of type {0}.", typeof(T));
        return null;
    }

答案 6 :(得分:1)

Throws.InstanceOf()允许您传递基本异常类型,而不是更具体的派生类型。

[Test]
public void CreateFile_InvalidFileName_ThrowsException()
{
    //Arrange
    var logger = SetupLogger("?\\");

    //Act

    //Assert
    Assert.That(() => logger.CreateFile(), Throws.InstanceOf<Exception>());
}