【问题标题】:Mock Unit tests for Linq statements in .Net core 2.2 always return null.Net core 2.2 中 Linq 语句的模拟单元测试总是返回 null
【发布时间】: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);

我知道我们不能模拟 WhereFirstOrDefault 方法,但是没有办法模拟我的网络服务 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


【解决方案1】:

正如上面评论中提到的Tseng。我们不模拟DbContext,我们模拟存储库本身。

所以我使用了InMemoryDatabase 测试。向我的内存数据库中添加了一些数据,这使我的DbContext 返回了我想要的数据。

        var mapOptions = new DbContextOptionsBuilder<MapViewerContext>()
               .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
               .Options;
        var identityOptions = new DbContextOptionsBuilder<AppIdentityDbContext>()
            .UseInMemoryDatabase(databaseName: Guid.NewGuid().ToString())
            .Options;
        var mapContext = new MapViewerContext(_configuration.Object, mapOptions);
        var appIdentityContext = new AppIdentityDbContext(_configuration.Object, identityOptions);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2018-09-12
    • 2017-04-14
    • 2021-08-02
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多