9

ルートパーツをからMoqingしています rps = new List... (3 Route Parts)

そしてMoqing GetEnumerator()私のルートについては以下のように

route.Setup(ro => ro.GetEnumerator()).Returns(rps.GetEnumerator());

しかし、Moq次のコードでは、への呼び出しで「シーケンスに要素が含まれていません」で失敗しますLast()

o.Route.Any(rp => rp.IsNonTowLocation && 
rp != o.Route.First() && 
rp != o.Route.Last())

すぐにウィンドウを見ると、複数回First() Last()実行すると値が変わることがわかります。First() Last()まるで呼び出されたMoveNext()が呼び出されなかったかのようにReset()、そしてEnumerableは完全に混乱しました。誰かがこれを経験しMoq、解決策を見つけましたか?

4

1 に答える 1

17

毎回同じ列挙子インスタンスを返すようにGetEnumeratorを設定しました。

route.Setup(ro => ro.GetEnumerator()).Returns(rps.GetEnumerator());

これは次と同等です。

var enumerator = rps.GetEnumerator()
route.Setup(ro => ro.GetEnumerator()).Returns(enumerator);

呼び出しごとに新しい列挙子が必要な場合は、Returnsラムダ式を渡す必要があります。

route.Setup(ro => ro.GetEnumerator()).Returns(() => rps.GetEnumerator());

GetEnumerator()が呼び出されるたびにラムダが呼び出されるためFirst()Last()期待どおりに機能するはずです。

于 2011-07-15T06:21:30.210 に答える