我遇到过一个我不太确定如何处理的场景。
我们正在努力使我们的单元测试代码覆盖率达到 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
,您会得到非常困惑的结果。
简而言之:
- 保留默认的单元测试,如果通过则抛出异常 出乎意料的事情(如上面的行)
- 不要这样做。如果有人没有说明他们想要这个, 他们不希望它被退回
你甚至可以通过这样做来引发异常:
QuarterFactory.CreateQuarter(0);
关于c# - 编程和单元测试最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7637672/