You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Moq模拟IUnitOfWork中Repository方法返回null而非预期值问题

解决Moq模拟IUnitOfWork中ICarRepository.GetById返回null的问题

问题原因

直接在IUnitOfWork的Mock实例上配置嵌套的CarRepository.GetById方法,Moq无法自动创建并正确配置底层的ICarRepository实例,导致调用方法时返回默认的null值。

解决方案步骤

  • 先单独创建ICarRepository的Mock实例,并配置其GetById方法的返回值
  • 将配置好的ICarRepositoryMock实例绑定到IUnitOfWorkMock的CarRepository属性上
  • 再通过IUnitOfWork的实例调用Repository方法

修正后的测试代码

[Test]
public async Task Test()
{
    // 1. 初始化ICarRepository的Mock并配置方法
    var carRepoMock = new Mock<ICarRepository>();
    carRepoMock.Setup(repo => repo.GetById(It.IsAny<int>()))
               .ReturnsAsync(new Car { Name = "test" });

    // 2. 初始化IUnitOfWork的Mock,并绑定已配置的Repository
    var unitOfWorkMock = new Mock<IUnitOfWork>();
    unitOfWorkMock.Setup(uow => uow.CarRepository)
                  .Returns(carRepoMock.Object);

    // 3. 执行测试调用
    var car = await unitOfWorkMock.Object.CarRepository.GetById(1); 
    // 此时car为预期的Car实例,不再返回null

    var car2 = await unitOfWorkMock.Object.CarRepository.GetById(1); 
    // car2同样会返回预期实例
}

额外说明

如果需要针对特定ID返回特定实例,可以将It.IsAny<int>()替换为具体的匹配条件,例如:

carRepoMock.Setup(repo => repo.GetById(1))
           .ReturnsAsync(new Car { Name = "test", Id = 1 });

内容的提问来源于stack exchange,提问作者user1765862

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:22:29