我们有一个相当复杂的界面层次结构,我很难让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());
答案 0 :(得分:1)
您的设置返回的对象实际上是否有数据?这可能是你的问题。