这是一个延迟执行问题。但是,我的问题源于我无法确定为什么有时会延迟执行此执行,而不是其他时间。
代码:
IList<LineItem> freeFlatItems = new List<LineItem>();
if(QualifyFreeFlatShipping)
freeFlatItems = lineItems.Where(l => l.FlatShippingRate != null).ToList();
decimal? freeFlatShippingTotal = freeFlatItems.Sum(l => l.FlatShippingRate);
var globalShippingPromos = _promoService.GetGlobalShippingPromos();
问题:
此代码正在生产中,并按预期工作。我最近在其他地方进行了更改,发现该测试在我们的单元测试中不起作用。当我逐步执行此功能时,会发生以下情况:
- 在到达此代码之前,我验证了输入数据。中的所有项目
lineItems
。每个项目的价值.FlatShippingRate
- QualifyFreeFlatShipping 是
true
- 代码执行到达第 4 行的 linq 语句 (
freeFlatItems = etc...
) - 的值
freeFlatItems
保持不变,因为执行继续到第 6 行 (decimal? freeFlatShippingTotal = etc...
) .Sum
在一个空列表中执行。- 到达第 8 (
var globalShippingPromos = etc...
) 行时,freeFlatItems
finally 的值会更新为应有的值。但是... sum 是在之前的值上运行的,我的运费总额不正确。
问题:
- 为什么这仍然被推迟?我以为
.ToList()
强制执行 linq 以生成IList<T>
- 为什么这以一致的方式表现不同?(我的测试总是以这种方式运行,生产工作正常,LinqPad 中的这段代码工作正常)。在你提出建议之前,我已经验证了我的测试是正确建立的。通过验证调试器中的输入数据,在测试代码和上述第一步中都如此。