これは遅延実行の問題です。ただし、私の問題は、この実行が時々遅れる理由を確認できないという事実に起因しています。
コード:
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
空のリスト全体で実行されます。var globalShippingPromos = etc...
8 行目 ( )に到達すると、freeFlatItems
finallyの値が本来あるべき値に更新されます。しかし...合計は以前の値で実行され、私の配送合計は正しくありません。
質問):
- なぜこれはまだ遅れているのですか?
.ToList()
私はlinqの実行を強制して生成すると思ったIList<T>
- これが一貫した方法で異なる動作をするのはなぜですか? (私のテストは常にこのように動作し、本番環境は正常に動作し、LinqPad のこのコードは正常に動作します)。そして、あなたがそれを提案する前に、私のテストが正しく構築されていることを検証しました. テスト コードと上記の手順 1 の両方で、デバッガーで入力データを検証します。