Moq First()Last()和GetEnumerator()wierdness

时间:2011-07-15 00:23:42

标签: linq moq enumerable

我是莫青我的路线零件 rps =新列表<IRoutePart> ...(3路线部分)

和Moqing GetEnumerator()我的路线如下

route.Setup(ro =&gt; ro.GetEnumerator())。返回(rps.GetEnumerator());

但Moq在以下代码中失败,在调用Last()

时“Sequence contains no elements”

o.Route.Any(rp =&gt; rp.IsNonTowLocation&amp;&amp; rp!= o.Route.First()&amp;&amp; rp!= o.Route.Last())

在即时窗口中查看First()Last()如果我多次执行First()Last(),我会发现值会发生变化。就好像MoveNext()被调用而不是Reset()和Enumerable它完全混淆了。有没有人在Moq遇到这个问题并找到解决方案?

1 个答案:

答案 0 :(得分:17)

您已经设置了GetEnumerator,以便每次都返回相同的枚举器实例。

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

这相当于:

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

如果你想在每次调用时都有一个新的枚举器,那么你需要传递一个lambda表达式:

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

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