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

waxmsbnn  于 2023-02-06  发布在  .NET
关注(0)|答案(7)|浏览(147)

我有一个创建文件的类。
我现在正在做集成测试,以确保类是好的。
我传入了无效的目录和文件名,以确保抛出异常。
在我的测试中,我使用:

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

    //Act

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

但是在这个场景中,测试失败了,因为抛出了一个ArgumentException。我以为只添加Exception就可以通过。
有没有办法只用Exception完成这一遍?

vnjpjtjt

vnjpjtjt1#

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);
}
uurv41yg

uurv41yg2#

对于NUnit 2.5及更高版本

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

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

8oomwypt3#

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

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

    //Act

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

htrmnn0y4#

您的异常应该是确定性的,并且您应该能够编写测试用例来设置将引发特定异常的条件,并且您应该针对该特定异常进行测试。
因此,您的测试应重写为

CreateFile_InvalidFileName_ThrowsArgumentException

以及

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

编辑:
顺便说一句,我认为你的构造函数应该检测无效的文件名,并把它扔到那里,然后它应该是构造函数的一个契约,文件名是有效的。

axkjgtzd

axkjgtzd5#

一般来说,您应该只测试特定的例外状况,以确定您的程式码会正确回应不同的错误。
如果您真的需要允许任何异常来进行测试,只需使用标准的try/catch块和普通的Success/FailureAssert。

p1iqtdky

p1iqtdky6#

你可以用属性ExpectedException来标记你的测试方法,这应该是可行的。

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

    }
ecbunoof

ecbunoof7#

编写您自己的方法并使用该方法进行验证。

/// <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;
    }

相关问题