我有一个创建文件的类。
我现在正在进行集成测试以确保课程正常。
我传入的目录和文件名无效,以确保抛出异常。
在我的测试中,我正在使用:
[Test]
public void CreateFile_InvalidFileName_ThrowsException()
{
//Arrange
var logger = SetupLogger("?\\");
//Act
//Assert
Assert.Throws<Exception>(()=> logger.CreateFile());
}
但是在这种情况下,测试失败,因为抛出了ArgumentException。我想通过添加Exception它会通过。
有没有办法让这个传递只使用Exception?
答案 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>());
}