最小起订量 - 无法循环访问隐藏的 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());
设置返回的对象是否实际包含数据?这可能是你的问题。