Xunit+Moq单元测试问题:serviceResponse始终返回null
解决Moq模拟服务后GetHospitalsAsync返回null的问题
问题核心是你对IHospitalService的Mock实例没有正确配置GetHospitalsAsync方法的返回值。Moq对未设置Setup的方法,会返回对应类型的默认值(引用类型即为null),所以控制器中调用该方法得到的serviceResponse自然为null。
修复步骤
1. 检查MockServiceFactory的GetHospitals方法
打开MockServiceFactory类,找到GetHospitals()方法,确认是否为GetHospitalsAsync配置了非null的返回值。如果没有,补充以下Setup代码:
public IHospitalService GetHospitals() { var mock = new Mock<IHospitalService>(); // 配置GetHospitalsAsync返回一个有效的ServiceResponse实例 mock.Setup(service => service.GetHospitalsAsync( It.IsAny<HospitalRequestFilter>(), It.IsAny<bool>())) .ReturnsAsync(new ServiceResponse<HospitalQueryModel> { Success = true, Data = new List<HospitalQueryModel> { // 按需添加测试用的医院数据 new HospitalQueryModel { Code = "Abc", Name = "Abc hospital" } } }); return mock.Object; }
2. 或在单元测试中手动补充Setup
如果不想修改MockServiceFactory,可在单元测试的Arrange阶段,对已获取的hospitalServiceMock补充返回值配置:
// Arrange阶段新增代码 var mockHospitalService = Mock.Get(hospitalServiceMock); mockHospitalService.Setup(s => s.GetHospitalsAsync( It.IsAny<HospitalRequestFilter>(), It.IsAny<bool>())) .ReturnsAsync(new ServiceResponse<HospitalQueryModel> { Success = true, Data = new List<HospitalQueryModel>() });
3. 完善断言逻辑
当前断言仅检查返回的IActionResult不为null,建议进一步验证响应内容是否符合预期:
// Assert var okObjectResult = Assert.IsType<OkObjectResult>(hospital); var serviceResponse = Assert.IsType<ServiceResponse<HospitalQueryModel>>(okObjectResult.Value); Assert.NotNull(serviceResponse); Assert.True(serviceResponse.Success); // 可继续验证Data属性是否包含预期的测试数据
内容的提问来源于stack exchange,提问作者prashanthi
相关产品推荐
相关产品推荐

