Moq - 无法遍历隐藏的IEnumerable

时间:2011-05-11 03:14:15

标签: c# .net mocking moq

我们有一个相当复杂的界面层次结构,我很难让Moq做我想做的事。

我有一个扩展IReservation的接口IRulesReservation,并使用另一种类型的新实现隐藏其枚举器。

public interface IReservation : IRulesReservation
{
    new IEnumerator<IRoutePart> GetEnumerator();
}

IRulesReservation延伸IEnumerable

public interface IRulesReservation : IEnumerable<IRulesRoutePart>
{
}

我正在尝试测试的方法需要IReservation,但在不同的点需要访问IEnumerable<IRulesRoutePart>。我的模拟设置如下:

m_mock = new Mock<IReservation>();
m_mock.As<IRulesReservation>().Setup(r => r.GetEnumerator()).Returns(routeParts.Select(rp => (IRulesRoutePart)rp).GetEnumerator());

在示例中,routeParts是来自IRouteParts对象的Mock<IRouteParts>列表,这些对象是使用.As<IRulesRoutePart>()设置的。

每当我在使用枚举器测试的函数中获得一些代码时,它就会跨越迭代,就好像集合是空的一样。

我在设置中做错了什么?或者Moq是否无法处理以这种方式隐藏的枚举器?


编辑:我在模拟器上运行测试代码时发现的一些奇怪的行为:

Assert.That((reservation.Object as IRulesReservation).Count() == 8);
Assert.That((reservation.Object as IEnumerable<IRulesRoutePart>).Count() == 8);

第一行将通过,但第二行将失败。 我尝试更改模拟以专门设置IEnumerable<IRulesRoutePart>的枚举器,但没有效果:

m_mock.As<IEnumerable<IRulesRoutePart>>().Setup(r => r.GetEnumerator()).Returns(routeParts.Select(rp => (IRulesRoutePart)rp).GetEnumerator());

1 个答案:

答案 0 :(得分:1)

您的设置返回的对象实际上是否有数据?这可能是你的问题。