2017-03-09 117 views
0

我有最小訂單量這個奇怪的問題,我不能使用GetAll('include')方法來測試我的控制器。使用Moq進行單元測試並設置GetAll包含

我的測試初始化​​

// GetAll 
menusDb.Setup(m => m.GetAll()).Returns(menus.AsQueryable()); 
menusDb.Setup(m => m.GetAll(It.IsAny<Expression<Func<Menu, object>>>())) 
     .Returns((Expression<Func<Menu,object>> pred) => { 
      return menus.AsQueryable(); 
     }); 
// FindByIdAsync 
menusDb.Setup(m => m.FindByByIdAsync(It.IsAny<int>())) 
     .Returns((int x) => Task.FromResult(menus.Find(m => m.ID == x))); 
menusDb.Setup(m => m.FindByByIdAsync(It.IsAny<int>(), It.IsAny<Expression<Func<Menu, object>>[]>())) 
     .Returns((int x, Expression<Func<Menu, 
      object>>[] includeProperties) => Task.FromResult(menus.Find(m => m.ID == x))); 

現在,每當我試圖測試

_menusDB.GetAll(s=>s.Sections) 

menusdb.getAll的MOQ()方法,是不是在所有

所有其他的起訂量解僱方法正確觸發... 示例

_menusDB.GetAll(); 
_menusDB.FindByByIdAsync(id, 
       m => m.Sections.Select(s => s.Image), 
       m => m.Sections.Select(s => s.MenuItems.Select(mi => mi.Image))); 

這些都是Getall,並且在我的通用資源庫中使用include查找函數。

public IQueryable<TEntity> GetAll<TProperty>(Expression<Func<TEntity, TProperty>> propertyToInclude) {    
    return ObjectSet.Include(propertyToInclude); 
} 

public async Task<TEntity> FindByByIdAsync(int id, params Expression<Func<TEntity, object>>[] propertiesToInclude) {    
    var query = propertiesToInclude.Aggregate(ObjectSet as IQueryable<TEntity>, (current, property) => current.Include(property)); 
    return await query.SingleOrDefaultAsync(entity => entity.ID == id).ConfigureAwait(false); 
} 

回答

0

我終於發現問題在哪裏。 GetAll with include使用通用TProperty而不是對象來包含屬性。模擬不知何故將Tproperty對象與我在測試中提供的linq查詢聯繫起來。也許有一種方法可以使它工作,但現在我只是將通用屬性更改爲對象