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
相关产品推荐
相关产品推荐

