加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:17:55 所属栏目:百科 来源:网络整理
导读:我们有一个相当复杂的界面层次结构,我很难让Moq做我想做的事情. 我有一个接口IReservation,它扩展了IRulesReservation,并用其他类型的新实现隐藏了它的枚举器. public interface IReservation : IRulesReservation{ new IEnumeratorIRoutePart GetEnumerator
我们有一个相当复杂的界面层次结构,我很难让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());

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读