在实体框架 6 单元测试中枚举后,测试实体将消失



我正在使用 NSubstitute 来测试使用实体框架 6 的应用程序。

我使用本文作为我的设置的基础:https://msdn.microsoft.com/en-us/library/dn314429.aspx

每当我的代码枚举一个实体集两次时,所有实体都会消失。这可以通过运行来证明。ToList() 连续两次。

知道如何解决这个问题吗?

我创建了一个简单的测试来重新创建此行为:

[TestMethod]
public void DisappearingEntities()
{
    var db = Substitute.For<Entities>();
    var entityList = new[]
    {
        new Role(1, "Role1"),
        new Role(2, "Role2"),
        new Role(3, "Role3"),
        new Role(4, "Role4")    
    }.ToList();
    var queryableEntityList = entityList.AsQueryable();
    var set = Substitute.For<DbSet<Role>, IQueryable<Role>>();
    db.Roles.Returns(set);
    set.AsQueryable().Provider.Returns(queryableEntityList.Provider);
    set.AsQueryable().Expression.Returns(queryableEntityList.Expression);
    set.AsQueryable().ElementType.Returns(queryableEntityList.ElementType);
    set.AsQueryable().GetEnumerator().Returns(queryableEntityList.GetEnumerator());
    db.Set<Role>().Returns(db.Roles);
    set.AddRange(entityList);
    Assert.IsTrue(db.Roles.ToList().Count() == 4);
    //assert fails
    Assert.IsTrue(db.Roles.ToList().Count() == 4);
}

我认为第一个断言是"用完"枚举器,因此第二个断言没有留下任何元素。尝试将该存根替换为:

set.AsQueryable().GetEnumerator()
    .Returns(x => queryableEntityList.GetEnumerator());

此处的 lambda 函数可确保每次需要时都会返回新的枚举器。(此更改还与您提到的 MSDN 示例匹配。

最新更新