【发布时间】:2020-05-09 13:29:12
【问题描述】:
我知道有人问了很多嘲弄的问题,但没有一个对我有用。
我正在尝试为我拥有的服务编写单元测试。该服务具有以下代码行
var assignments = await _assignmentRepository.WhereAsync(as => as.DepartmentId == departmentId);
下面是WhereAsync方法的实现:
public async Task<List<T>> WhereAsync(Expression<Func<T, bool>> expression)
{
return await _dbContext.Set<T>().Where(expression).ToListAsync();
}
这是我的模拟测试语句(listAssignments 是一个预定义变量):
_assignmentRepository.Setup(rep => rep.WhereAsync(as => It.IsAny<bool>())).ReturnsAsync(listAssignments);
我知道我们不能模拟 Where 和 FirstOrDefault 方法,但是没有办法模拟我的网络服务 WhereAsync 方法吗??
【问题讨论】:
-
最大的问题是:你真正想测试什么?通常你模拟存储库,而不是 DbContext,所以你的存储库实现根本不重要,你模拟存储库接口。单元测试 EF Core 毫无意义。您对您的代码进行单元测试,而不是其他代码
-
我正在测试一项服务。服务接收部门 ID 作为参数并返回该部门的分配。所以我正在执行分配存储库中实现的
WhereAsync,其中assignment.departmentId等于Id由参数发送。 -
那不是单元测试。在单元测试中,您将 repository implementation 的调用替换为一个 mock,该 mock 将 you 希望/require 的结果返回给对象逻辑 relying在存储库上
标签: unit-testing asp.net-core mocking asp.net-core-2.2