使用 Moq 进行单元测试并使用 include 设置 GetAll
Unit testing using Moq and setting up GetAll with include
我遇到了这个奇怪的最小起订量问题,我无法使用 GetAll('include') 方法来测试我的控制器。
我的测试初始化
// 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 和 find 函数。
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);
}
终于找到问题出在哪里了。 GetAll with include 使用通用 TProperty 而不是对象来包含属性。 Mock 无法以某种方式将对象 T属性 与我在测试中提供的 linq 查询相关联。也许有办法让它工作,但现在我只是将通用 属性 更改为 object
我遇到了这个奇怪的最小起订量问题,我无法使用 GetAll('include') 方法来测试我的控制器。
我的测试初始化
// 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 和 find 函数。
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);
}
终于找到问题出在哪里了。 GetAll with include 使用通用 TProperty 而不是对象来包含属性。 Mock 无法以某种方式将对象 T属性 与我在测试中提供的 linq 查询相关联。也许有办法让它工作,但现在我只是将通用 属性 更改为 object