Moq First () Last () и GetEnumerator () странность - PullRequest
9 голосов
/ 15 июля 2011

Я выполняю свои части маршрута из rps = новый список <IRoutePart> ... (3 части маршрута)

и Moqing GetEnumerator () для моего маршрута, как показано ниже

.Setup (ro => ro.GetEnumerator ()). Возвращает (rps.GetEnumerator ());

, но Moq завершается ошибкой в ​​следующем коде с «Последовательность не содержит элементов» при вызове Last ()

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

Взгляд вначале () Last () в ближайших окнах я обнаружил, что значения меняются, если я выполняю First () Last () несколько раз.Это как будто MoveNext () вызывается, но не Reset () и Enumerable это полностью запутано.Кто-нибудь сталкивался с этим с Moq и нашел решение?

1 Ответ

17 голосов
/ 15 июля 2011

Вы настроили свой GetEnumerator так, чтобы он каждый раз возвращал один и тот же экземпляр перечислителя.

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

Это эквивалентно:

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

Если вы хотите, чтобы новый перечислитель был включенкаждый вызов, затем вам нужно пройти. Возвращает лямбда-выражение:

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

Лямбда будет вызываться каждый раз, когда вызывается GetEnumerator () - поэтому First() и Last() должны работать должным образом.

...