【发布时间】:2021-12-13 13:34:49
【问题描述】:
我正在尝试测试存储库的 Get 方法。签名如下:
public virtual async Task<IList<TType>> GetAsync<TType>(
Expression<Func<T, bool>> filter,
Expression<Func<T, TType>> select = null,
Func<IQueryable<T>, IOrderedQueryable<T>> orderBy = null,
params Expression<Func<T, object>>[] includes)
{
......................
}
该方法通常以如下方式调用:
var user = await repository.GetAsync(x => x.Name == name, x => new { x.Dob, x.Age });
它适用于真实数据,当我尝试设置此方法以返回具有问题开始的特定 lambda 的特定“用户”时。
我的问题是如何模拟下面的选择器并指定 Returns 语句。
Expression<Func<T, TType>> select = null,
我已经尝试了以下方法并最终出现错误。
unitOfWork.Setup(_ => _.repository.GetAsync(
It.IsAny<Expression<Func<User, bool>>>(),
It.IsAny<Expression<Func<User, object>>>()))
.Returns(Task.FromResult(users));
错误:
无法从 'System.Threading.Tasks.Task
谁能帮助我,或者至少把我推向正确的方向?
【问题讨论】:
-
你不能模拟一个表达式。就像名字已经说的那样,它是一种表达方式。它将被存储库读取,因此您必须模拟存储库
.GetAsync()并确保它可以处理所需的有效表达式并在测试中返回伪造的结果。 -
嗨奥利弗,感谢您的回复。是的,我的问题是在 .GetAsync() 如何模拟表达式。
-
你试过
.ReturnsAsync(users)吗?
标签: linq unit-testing asp.net-core moq repository-pattern