0

I'm using NSubstitute to test an application using Entity Framework 6.

I used this article as the base for my setup: https://msdn.microsoft.com/en-us/library/dn314429.aspx

Whenever my code enumerates an entity set twice, all the entities disappear. This can be demonstrated by running .ToList() twice in a row.

Any idea how to fix this issue?

I created a simple test to recreate this behavior:

[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);
}
Vilém Procházka
  • 1,060
  • 2
  • 17
  • 28

1 Answers1

1

I think the first assertion is "using up" the enumerator so it has no elements left by the second assertion. Try replacing that stub with:

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

The lambda function here ensures that a new enumerator will be returned each time it is required. (This change also matches the MSDN example you mentioned.)

David Tchepak
  • 9,826
  • 2
  • 56
  • 68