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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:10:29