最小起订量 - 无法循环访问隐藏的 IEnumerable

本文关键字:访问 循环 隐藏 IEnumerable | 更新日期: 2023-09-27 17:55:52

我们有一个相当复杂的界面层次结构,我正在努力让 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 是来自使用 .As<IRulesRoutePart>() 设置的Mock<IRouteParts>对象的IRouteParts列表。

每当我在测试的函数中使用枚举器时,它都会遍历迭代,就好像集合为空一样。

我在设置中做错了什么吗?还是 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());

最小起订量 - 无法循环访问隐藏的 IEnumerable

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