2016-03-07 120 views
0

我使用NSubstitute使用實體框架6.測試實體實體框架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); 
} 

回答

1

我認爲第一個斷言「使用了」枚舉所以它沒有第二斷言離開元素。嘗試替換該存根:

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

此處的lambda函數確保每次需要時都會返回一個新的枚舉數。 (此更改也與您提到的MSDN example相匹配。)

+0

太棒了!我不知道我該如何錯過。謝謝! –

+0

很高興我能幫忙:) –