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

ASP.NET Core MVC集成测试中如何检查控制器返回的模型数据

如何在ASP.NET Core MVC集成测试中验证控制器返回的模型数据

你当前通过WebApplicationFactory的HttpClient只能拿到渲染后的HTML响应,无法直接获取控制器返回的ThingVm模型。以下是两种常用的解决方案:


方案一:直接调用控制器方法(半集成测试)

利用WebApplicationFactory的服务容器,直接实例化控制器并调用Action方法,跳过HTTP请求管道,直接获取ViewResult中的模型。这种方式兼顾集成测试的服务依赖真实性,又能直接验证模型数据。

示例代码

[Fact]
public async Task ViewTest_CheckViewModelAsync()
{
    // 创建服务范围,获取容器内的服务实例
    using var scope = mockWebApp.Services.CreateScope();
    var services = scope.ServiceProvider;

    // 获取控制器依赖的服务(Mediator、Mapper)
    var mediator = services.GetRequiredService<IMediator>();
    var mapper = services.GetRequiredService<IMapper>();

    // 实例化控制器
    var controller = new ThingsController(mediator, mapper);
    // 调用目标Action
    var result = await controller.ViewAsync(1) as ViewResult;

    // 验证模型数据
    result.ShouldNotBeNull();
    var vm = result.Model as ThingVm;
    vm.ShouldNotBeNull();
    vm.Id.ShouldBe(1);
    // 根据你的ThingVm属性添加更多验证逻辑,比如vm.Name.ShouldBe("测试名称")
}

补充:模拟Mediator返回结果

如果需要控制Mediator的返回值(避免依赖真实数据库或外部服务),可以在创建WebApplicationFactory时替换服务:

var mockWebApp = new WebApplicationFactory<Program>()
    .WithWebHostBuilder(builder =>
    {
        builder.ConfigureServices(services =>
        {
            // 移除原有IMediator注册
            var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(IMediator));
            if (descriptor != null) services.Remove(descriptor);

            // 添加Mock的IMediator
            var mockMediator = new Mock<IMediator>();
            mockMediator.Setup(m => m.Send(It.IsAny<GetThingCommand>(), default))
                .ReturnsAsync(new GetThingCommandResult
                {
                    Error = false,
                    Dto = new ThingDto { Id = 1, Name = "预设测试数据" }
                });
            services.AddSingleton(mockMediator.Object);
        });
    });

方案二:解析HTML验证模型渲染结果(全集成测试)

如果要保持完整的HTTP请求流程(模拟真实用户访问),可以解析返回的HTML内容,验证模型数据是否正确渲染到页面中。推荐使用AngleSharp库处理HTML解析。

步骤1:安装AngleSharp

Install-Package AngleSharp

示例代码

[Fact]
public async Task ViewTest_CheckHtmlContentAsync()
{
    var client = mockWebApp.GetClient();
    var response = await client.GetAsync("/Things/View/1");

    response.EnsureSuccessStatusCode();
    var htmlContent = await response.Content.ReadAsStringAsync();

    // 解析HTML
    var context = BrowsingContext.New(Configuration.Default);
    var document = await context.OpenAsync(req => req.Content(htmlContent));

    // 验证页面中的模型数据(假设视图中用id="thing-id"显示ID,id="thing-name"显示名称)
    var thingIdElement = document.QuerySelector("#thing-id");
    thingIdElement.ShouldNotBeNull();
    thingIdElement.TextContent.ShouldBe("1");

    var thingNameElement = document.QuerySelector("#thing-name");
    thingNameElement.ShouldNotBeNull();
    thingNameElement.TextContent.ShouldBe("预设测试数据");
}

方案选择

  • 若只需验证模型数据正确性,不关心视图渲染细节:选方案一
  • 需验证完整HTTP流程及视图渲染结果:选方案二

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 07:25:00