gpt4 book ai didi

c# - CodeCoverage 与 ExpectedException

转载 作者:太空狗 更新时间:2023-10-29 18:17:18 26 4
gpt4 key购买 nike

我有几个这种模式的单元测试:

[TestMethod ()]
[ExpectedException (typeof (ArgumentNullException))]
public void DoStuffTest_Exception ()
{
var foo = new Foo ();
Foo.DoStuff (null);
}

事实证明,代码覆盖将抛出线标记为运行一半,所以我每次都得到 1 block 未覆盖的代码。

考虑这个问题一段时间后,我能想到的最佳解决方案是添加一个 try/catch。由于这是一个重复的模式,我将按照以下方式创建一个辅助方法

public static void ExpectException<_T> (Action action) where _T: Exception
{
try { action(); }
catch (_T) { return; }
Assert.Fail ("Expected " + _T);
}

这会有很好的附带好处,我可以将所有异常测试添加到非抛出测试中。

这是一个有效的设计,还是我遗漏了什么?

编辑: 哎呀...似乎上面的 ExpectException 方法也给我留下了 1 个未覆盖的 block 。

最佳答案

您的建议是有效的。除了你的代码覆盖率问题,我认为它比使用 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;
}

这将使测试代码能够在需要时进一步断言异常(即检查是否使用了特定消息)。

NUnit(虽然它看起来不像你在使用它,因为你有一个 TestMethod 属性)有一个类似于你所建议的内置构造:

Assert.Throws<ArgumentNullException>(() => Foo.DoStuff(null))

关于c# - CodeCoverage 与 ExpectedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1606411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com