编程和单元测试最佳实践

Zac*_*ack 4 c# tdd unit-testing

我遇到过一个我不太确定如何接近的情景.

我们试图将我们的单元测试代码覆盖率提高到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));
       }
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我要问的第一个问题是:
既然工厂已经完成了枚举,我是否为了代码覆盖而删除了默认异常,或者在有人添加新类型的情况下将异常作为默认值保留在那里对枚举和忘记修改工厂?

我要问的第二个问题是:
如果我决定删除异常并将类型默认为UnpaidBreakQuarter - 默认情况下IQrosser返回到UnpaidBreakQuarter是否有意义,或者这会引发"为什么默认为UnpaidBreakQuarter"的问题,这是否有商业规则?"

问候,

詹姆士

Osk*_*lin 5

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

QuarterFactory.CreateQuarter((IntervalType)0);
Run Code Online (Sandbox Code Playgroud)

因此,这也回答了第二个问题.如果返回结果,你可能会得到非常令人困惑的结果UnpaidBreakQuarter.

简而言之:

  1. 如果传递意外的东西(如上面一行),保持默认的单元测试它抛出异常
  2. 不要这样做.如果有人没有指明他们想要这个,他们就不会期望它被退回

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

QuarterFactory.CreateQuarter(0);
Run Code Online (Sandbox Code Playgroud)