【发布时间】:2021-01-03 13:04:02
【问题描述】:
我很困惑为什么我在这段代码的测试中没有获得 100% 的测试分支覆盖率:
public List<ReturnItem> FilterItems(List<Items> items)
{
if (items== null || !items.Any())
{
throw new ArgumentException("No items to filter");
}
var newItems = new List<NewItem>();
foreach (var item in items)
{
if (item.Tracking.MidStateDate != null)
{
if (orderLine.Tracking.EndStateDate.GetValueOrDefault() < orderLine.Tracking.MidStateDate)
{
var newItem = new NewItem(item);
newItem.MidStateDate = item.Tracking.MidStateDate.Value;
newItems.Add(newItem);
}
}
}
return newItems;
}
我进行了以下测试:
- NoItems();
- HasItems_NullTracking();
- HasItems_NoTracking();
- HasItems_HasTracking_NoMidStateDate();
- HasItems_HasTracking_HasMidStateDate_NullEndStateDate();
- HasItems_HasTracking_HasMidStateDate_SmallerEndStateDate();
- HasItems_HasTracking_HasMidStateDate_EndStateDateIsEqual();
- HasItems_HasTracking_HasMidStateDate_LargerEndStateDate();
- HasItems_HasTracking_HasMidStateDate_MixedState();
我无法让分支覆盖率测试达到 100%。这让我觉得我错过了一些东西。我已经删除了大部分代码,发现问题与这个条件if (orderLine.Tracking.EndStateDate.GetValueOrDefault() < orderLine.Tracking.MidStateDate)有关。
谁能建议我可以添加的任何其他单元测试来处理分支覆盖率问题?
【问题讨论】:
-
计算覆盖率的工具很可能是错误的。一般来说,尝试获得 100% 的覆盖率不应该是您的目标,大约 90% 是更合理的(或者基于代码库大小的更少)。
-
看起来您没有测试第一条路径,其中
items是null(应该抛出ArgumentNullException,而不是基ArgumentException,顺便说一下)。这与“没有项目”不同。 -
@madreflection 不幸的是,并非如此
-
@juharr 虽然我同意这有点 OTT,但这是我正在处理的代码库的要求。如果我因一个 dotnet core SDK 错误而浪费了一天时间,我会非常恼火,而不是以前没有发生过。
-
谢谢你们的建议,伙计们。
标签: c# .net unit-testing code-coverage