c# - 编程和单元测试最佳实践

标签 c# unit-testing tdd

我遇到过一个我不太确定如何处理的场景。

我们正在努力使我们的单元测试代码覆盖率达到 100%。

我一直在尝试采用 TDD 方法进行开发、编写测试、使其通过、编写失败的测试、添加更多代码使其通过等。

在这样做的时候我发现我写了一个这样的类:

public enum IntervalType : int
{
    Shift = 1,
    PaidBreak = 2,
    UnpaidBreak = 3
}


public static class QuarterFactory
{
   public static IQuarter CreateQuarter(IntervalType intervalType)
   {
      switch (intervalType)
      {
           case IntervalType.Shift:
                return new ShiftQuarter();
           default:
                throw new ArgumentException(String.Format("Unable to create a Quarter based on an IntervalType of: {0}", intervalType));
       }
    }
 }

随着编码的进步,工厂扩展为:

public static class QuarterFactory
{
    public static IQuarter CreateQuarter(IntervalType intervalType)
    {
        switch (intervalType)
        {
            case IntervalType.Shift:
                return new ShiftQuarter();
            case IntervalType.PaidBreak:
                return new PaidBreakQuarter();
            case IntervalType.UnpaidBreak:
                return new UnpaidBreakQuarter();
            default:
                throw new ArgumentException(String.Format("Unable to create a Quarter based on an IntervalType of: {0}", intervalType));
        }
    }
}

我要问的第一个问题是:
既然工厂完成了枚举,我是为了代码覆盖而删除默认异常,还是将异常保留在那里作为默认值,以防有人向枚举添加新类型而忘记修改工厂?

我要问的第二个问题是:
如果我决定删除异常并将类型默认为 UnpaidBreakQuarter - 将返回的 IQuarter 默认为 UnpaidBreakQuarter 是否有意义,或者这会引发“为什么默认为 UnpaidBreakQuarter,是有这方面的业务规则吗?”。

问候,

詹姆斯

最佳答案

您仍然可以获得 100% 的代码覆盖率。考虑以下编译得很好的行:

QuarterFactory.CreateQuarter((IntervalType)0);

因此,这也回答了第二个问题。如果返回 UnpaidBreakQuarter,您会得到非常困惑的结果。

简而言之:

  1. 保留默认的单元测试,如果通过则抛出异常 出乎意料的事情(如上面的行)
  2. 不要这样做。如果有人没有说明他们想要这个, 他们不希望它被退回

你甚至可以通过这样做来引发异常:

QuarterFactory.CreateQuarter(0);

关于c# - 编程和单元测试最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7637672/

相关文章:

c# - 有没有什么好的方法来加密 C# 桌面应用程序

c# - 即使存在命名空间也能工作的表达式?

c# - MSTest:没有运行测试,因为没有加载测试或禁用了选定的测试

jquery - 在单元测试时阻止 document.ready() 函数

使用脚本语言的 C++ 单元测试

unit-testing - TDD:您为单元测试公开了哪些方法?

c# - 如何使用 .Net IO 类创建可测试代码?

c# - 如何从ms word文档的当前可见页面获取单词?

c# - EF vs SQL 奇怪的慢

python - pytest & Monkeypatching - 无法获取返回值