9

我正在摸清我的路线零件 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 一个 lambda 表达式:

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

每次调用 GetEnumerator() 时都会调用 lambda - 因此First()应该Last()按预期工作。

于 2011-07-15T06:21:30.210 回答