繁体   English   中英

Foreach noop将所有元素隐藏在模拟的Dbset中

[英]Foreach noop hides all elements in mocked Dbset

我正在使用EntityFramework和Moq进行单元测试的应用程序中编写单元测试。 在测试“ GetAll”方案时,我发现尽管我模拟了一组3个项目,但没有一个返回。 我仔细检查了一下代码,发现foreach执行清除了我的DbSet。 是什么原因造成的,我该如何解决?

IQueryable<Item> items = new List<Item>() {
    new Item()
 }.AsQueryable();

Mock<DbSet<Item>> mockItemDbSet = new Mock<DbSet<Item>>();
mockItemDbSet.As<IQueryable<Item>>().Setup(m => m.Provider).Returns(items.Provider);
mockItemDbSet.As<IQueryable<Item>>().Setup(m => m.Expression).Returns(items.Expression);
mockItemDbSet.As<IQueryable<Item>>().Setup(m => m.ElementType).Returns(items.ElementType);
mockItemDbSet.As<IQueryable<Item>>().Setup(m => m.GetEnumerator()).Returns(items.GetEnumerator());
DbSet<Item> itemDbSet = mockItemDbSet.Object;

CompanyContext context = Mock.Of<CompanyContext>(c =>
    c.Items == mockItemDbSet.Object
);

//itemDbSet has a single item
foreach (var item in context.Items) {}
//itemDbSet is empty

编辑:更多信息,更具体地讲,关于itemDbSet具有单个项目然后为空。 在foreach之前,itemDbSet.Count()为1,而itemDbSet.ToArray()。Count()为1。 在foreach之后,itemDbSet.Count()为1,而itemDbSet.ToArray()。Count()为0。魔术师在哪里执行此魔术?

一次检查项目计数后,枚举数位于末尾,需要重新设置。 将设置更改为此以重置枚举数。

        mockItemDbSet.As<IQueryable<Item>>().Setup(m => m.GetEnumerator()).Returns(() =>
        {
            var enumerator = items.GetEnumerator();
            enumerator.Reset();
            return enumerator;
        });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM