我有一堆测试覆盖率接近 100% 的程序集,但我经常遇到如下例所示的情况。我无法测试默认的 switch 案例,这是为了防止将来出现错误,在这种情况下,我向枚举添加了更多项目,但忘记更新 switch 语句以支持新项目。
我希望能够找到一种模式,在其中我可以消除“无法测试”的代码,对其进行测试,或者标记那行代码(但不是整个方法)以被排除覆盖率分析。
这听起来可能很傻,但我不想假设默认情况永远不会发生,我也不想将默认情况与已经存在的情况捆绑在一起。我希望在创建此类错误时抛出异常。这迟早会发生。
目前我使用 DotCover 来计算覆盖率。
注意:这只是示例代码,但我认为它说明了一种相当常见的模式。
public class Tester
{
private enum StuffToDo
{
Swim = 0,
Bike,
Run
}
public void DoSomeRandomStuff()
{
var random = new Random();
DoStuff((StuffToDo)random.Next(3));
}
private void DoStuff(StuffToDo stuff)
{
switch (stuff)
{
case StuffToDo.Swim:
break;
case StuffToDo.Bike:
break;
case StuffToDo.Run:
break;
default:
// How do I test or exclude this line from coverage?
throw new ArgumentOutOfRangeException("stuff");
}
}
}
最佳答案
私有(private)方法总是可以提取到它自己的类中。特别是,如果它们像您一样拥有复杂的逻辑。我建议您使用 DoStuff()
作为公共(public)方法创建一个 StuffDoer
类,并将其注入(inject)到您的 Tester
类中。然后你有:
DoStuff()
方法,可通过测试访问DoSomeRandomStuff()
方法,可以使用模拟而不是依赖于DoStuff()
的结果进行测试,从而使其成为真正的单元测试。<- 没有违反 SRP。
- 总而言之,代码漂亮、清晰、可靠。
关于c# - 如何从代码覆盖率中测试或排除私有(private)无法访问的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17324145/