微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Moq – 无法遍历隐藏的IEnumerable

我们有一个相当复杂的界面层次结构,我很难让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是来自Mock< IRouteParts>的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());

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐