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

