Entity Framework6单元测试中枚举后测试实体消失
Test entities disappear after enumeration in Entity Framework 6 unit test
我正在使用 NSubstitute 测试使用 Entity Framework 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);
}
我认为第一个断言是 "using up" 枚举器,因此第二个断言没有留下任何元素。尝试将存根替换为:
set.AsQueryable().GetEnumerator()
.Returns(x => queryableEntityList.GetEnumerator());
此处的 lambda 函数确保每次需要时都会返回一个新的枚举器。 (此更改也符合您提到的 MSDN example。)
我正在使用 NSubstitute 测试使用 Entity Framework 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);
}
我认为第一个断言是 "using up" 枚举器,因此第二个断言没有留下任何元素。尝试将存根替换为:
set.AsQueryable().GetEnumerator()
.Returns(x => queryableEntityList.GetEnumerator());
此处的 lambda 函数确保每次需要时都会返回一个新的枚举器。 (此更改也符合您提到的 MSDN example。)