c# - 如何从代码覆盖率中测试或排除私有(private)无法访问的代码

标签 c# unit-testing architecture code-coverage dotcover

我有一堆测试覆盖率接近 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/

相关文章:

ios - 待处理的 OCUnit 测试

asp.net-mvc - 测试使用DbContext的存储库的最佳方法

design-patterns - 状态机和状态模式的实现有什么区别?

architecture - 将ARM指令转换为i386指令

c# - 单击母版中的按钮时更改母版页

c# - C# 编译器是免费的吗?

c# - 如何在 IValidateOptions<T> 实现中触发模型验证?

c# - GridView 和 RowDataBound 事件

c++ - 模拟免费功能

architecture - 在敏捷开发中,您如何处理 "less-well-architected"代码,这些代码源于以 sprint 为中心的心态