就在我回复@juharr的时候,我灵机一动。
我很纠结为什么我在测试这段代码时没有获得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)
有关。
有人能建议我添加任何其他单元测试来处理分支覆盖率问题吗?
问题在于代码不是显式的,有问题的条件中的日期时间可以为null。
if (orderLine.Tracking.EndStateDate.GetValueOrDefault() < orderLine.Tracking.MidStateDate)
^导致问题
if (orderLine.Tracking.EndStateDate.GetValueOrDefault() < orderLine.Tracking.MidStateDate.Value)
^工作!