maf*_*afu 8 c# unit-testing expected-exception
我有几个这种模式的单元测试:
[TestMethod ()]
[ExpectedException (typeof (ArgumentNullException))]
public void DoStuffTest_Exception ()
{
var foo = new Foo ();
Foo.DoStuff (null);
}
Run Code Online (Sandbox Code Playgroud)
事实证明,代码覆盖率将抛出线标记为半运行,因此每次我得到1块未覆盖的代码.
在考虑了这个问题一段时间后,我能想出的最佳解决方案是添加一个try/catch.由于这是一个重复的模式,我将创建一个帮助方法
public static void ExpectException<_T> (Action action) where _T: Exception
{
try { action(); }
catch (_T) { return; }
Assert.Fail ("Expected " + _T);
}
Run Code Online (Sandbox Code Playgroud)
这将有很好的附带好处,我可以将所有异常测试添加到非投掷测试.
这是一个有效的设计,还是我错过了什么?
编辑: Ugs ...看起来像上面的ExpectException方法也留下了1个未覆盖的块.
adr*_*nks 10
你的建议是有效的.除了代码覆盖问题,我认为它比使用ExpectedException属性更好,因为它明确显示了测试的哪一行应该抛出异常.使用ExpectedException意味着测试中的任何代码行都可以抛出预期的异常类型,测试仍然会通过.如果错误源自另一个不希望抛出的调用,它可以掩盖测试应该失败的事实,因为应该抛出的行不是.
对你提出的建议有什么有用的修改是返回被捕获的异常:
public static _T ExpectException<_T> (Action action) where _T: Exception
{
try { action(); }
catch (_T ex) { return ex; }
Assert.Fail ("Expected " + typeof(_T));
return null;
}
Run Code Online (Sandbox Code Playgroud)
这将使测试代码能够在需要时进一步断言异常(即检查使用的特定消息).
NUnit(虽然看起来你没有使用它,因为你有一个TestMethod属性)有一个类似于你建议的内置结构:
Assert.Throws<ArgumentNullException>(() => Foo.DoStuff(null))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2534 次 |
| 最近记录: |