2017-06-19 62 views
1

我寫我的控制器單元測試。 本次測試使用的是內部使用一個模擬的DbContext的實際存儲庫類。我在這篇幫助文章中創建了dbset,它工作得很好 - 除了每個單元測試只能運行一次。EF庫返回dbset只有一次

http://codethug.com/2015/03/20/mocking-dbset/

這意味着:

IQueryable<User> membersQuery = this.unitOfWork.UserRepository.Get(); 
      List<User> members = membersQuery.ToList(); //here I get 6 members 
      membersQuery = this.unitOfWork.UserRepository.Get(); 
      members = membersQuery.ToList(); //when its called again, I get 0 members 

爲什麼會那樣做的,我希望它返回768,16成員兩次相同的集合。

這裏是我創建存儲庫

var enumerable = new List<User>(); 
// ... populate the mocks list 
var mockedContext = new Mock<MyDbContext>(); 
mockedContext.Setup(c => c.Users).ReturnsDbSet(enumerable); 
mockedContext.Setup(c => c.Set<User>()).ReturnsDbSet(enumerable); 
var repo = new Mock<IRepository<User>>();   
return new Repository<User>(mockedContext.Object, this.logger); 

爲了清楚起見,庫代碼的一些最重要的位:

public class Repository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
     protected internal MyDbContext Context; 
     protected internal DbSet<TEntity> DbSet; 
     public Repository(MyDbContext context) 
     { 
      this.Context = context; 
      this.DbSet = context.Set<TEntity>(); 
     } 

     public virtual IQueryable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null) 
     { 
      IQueryable<TEntity> query = this.DbSet; 

      if (filter != null) 
      { 
       query = query.Where(filter); 
      } 

      return query; 
     } 

任何想法,爲什麼它這樣做呢?

回答

2

基於鏈接的例子。所經歷的描述問題通常是由於這條線。

mockSet.As<IQueryable<T>>() 
    .Setup(m => m.GetEnumerator()) 
    .Returns(queryableData.GetEnumerator()); //<-- this here 

回報queryableData.GetEnumerator()這裏alony允許一次只進枚舉。

允許多個枚舉返回一個函數。

mockSet.As<IQueryable<T>>() 
    .Setup(m => m.GetEnumerator()) 
    .Returns(() => queryableData.GetEnumerator()); //<-- note the change() => 

的函數都會被調用需要一個枚舉時間,從而收集的多個枚舉。