我可以从代码覆盖中排除部分方法吗?

Tho*_*que 7 c# unit-testing code-coverage dotcover

我怀疑答案是否定的,但无论如何我都会问...

TL; DR

我知道我可以使用[ExcludeFromCodeCoverage]属性从覆盖率分析中排除一个类或方法,但有没有办法只排除方法的一部分

具体例子

我有一个懒惰地生成一系列int.MaxValue元素的方法:

private static IEnumerable<TElement> GenerateIterator<TElement>(Func<int, TElement> generator)
{
    for (int i = 0; i < int.MaxValue; i++)
    {
        yield return generator(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

在实践中,它永远不会被完全枚举,因此永远不会达到方法的结束.因此,DotCover认为该方法的20%未被覆盖,并且它将右大括号突出显示为未覆盖(对应return false于生成的MoveNext方法).

我可以编写一个消耗整个序列的测试,但是运行需要很长时间,特别是启用了覆盖范围.

所以我想找一种告诉DotCover的方法,不需要覆盖最后一条指令.

注意:我知道我并不需要单元测试所涵盖的所有代码; 某些代码片段不能或不需要进行测试,我通常会排除那些具有该[ExcludeFromCodeCoverage]属性的代码.但我喜欢100%报告我测试的代码的覆盖率,因为它可以更容易地发现未经测试的代码部分.当你知道没有更多东西需要测试时,有80%覆盖率的方法是非常烦人的...

ang*_*son 6

不,没有办法从使用 dotCover 的覆盖率分析中排除“方法的一部分”。

一般来说,你有几个选择:

  1. 将未覆盖的部分提取到自己的方法中,以便您可以从分析中正确忽略该方法
  2. 忽略问题

在这种情况下,可能会有第三种选择。由于您的测试代码使用了您的大部分方法,也许您应该只编写一个测试方法来确保代码运行完成?