【发布时间】:2020-11-17 18:15:01
【问题描述】:
我有一堆遵循这种模式的验证代码:
bool IsBroken()
{
var isBroken = Check(..., "error-1")
| Check(..., "error-2")
...
| Check(..., "error-n");
if (...)
{
isBroken |= Check(..., "error-1")
| Check(..., "error-2")
...
| Check(..., "error-n");
}
else
{
isBroken |= Check(..., "error-1")
| Check(..., "error-2")
...
| Check(..., "error-n");
}
// ...
// Could have more if-else or even nested if-else
return isBroken;
}
bool Check(bool condition, string message)
{
if (condition)
{
errors.Add(message);
}
return condition;
}
目标是执行所有检查,无论结果如何。然而,这段代码的问题在于它对分支覆盖不友好。
一个简单的解决方法是用函数体替换Check(bool, string),但这会产生另一个较小的问题,即代码混乱。我正在尝试找出一个可以让我两全其美的解决方案。有什么想法吗?!
【问题讨论】:
-
isBroken并不是真正需要的:return !errors.isEmpty() -
另外,可以使用
List<Validator>之类的东西,并遍历列表,其中每个列表项都封装了if。
标签: java c# unit-testing testing code-coverage