【发布时间】:2019-09-06 09:04:02
【问题描述】:
我在我的 IRepository 中模拟一个函数时遇到问题,需要有关将准确模拟该函数的代码的帮助
我尝试在 Moq 中为 It 对象中的任何参数模拟函数,但无法解析
这是我的 IRepository 接口中 ListAsync 的函数声明,我需要使用 where 模拟第二个并包含参数
Task<IEnumerable<TEntity>> ListAsync(params Expression<Func<TEntity, object>>[] include);
Task<IEnumerable<TEntity>> ListAsync(Expression<Func<TEntity, bool>> where, params Expression<Func<TEntity, object>>[] include);
函数调用如下:
var result = await _unitOfWork.XXXRepository.ListAsync(p => p.clientId == clientId);
我尝试的代码是:
_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => It.IsAny<Expression<Func<XXX, bool>>>())).ReturnsAsync(XXXs.AsEnumerable());
_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => Id == id)).ReturnsAsync(XXXs.AsEnumerable());
_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => p.Id == 1)).ReturnsAsync(XXXs.AsEnumerable());
有趣的是,当真正的函数代码类似于Where(p=>p.Id ==1) 时,最后一个解决方案p=>p.Id ==1 可以工作,但是当我在Where(p=>p.Id == clientId) 等实际函数中将id 作为参数时它不起作用
我的意思是我手动准备数据以返回其中有 6 个项目,并且无法从模拟函数返回结果中获取任何列表项
对解决方案有什么想法吗?
【问题讨论】:
标签: c# unit-testing asp.net-core moq