.NET 6集成测试:如何创建不执行主Program.cs的自定义Program类
如何创建测试专用的独立Program类(避免执行主项目自定义中间件)
要在集成测试中完全绕过主项目的Program.cs,你可以按以下步骤创建测试专用的启动类:
1. 在测试项目中创建测试专用Program类
在测试项目下新建一个Program.cs文件,编写仅满足测试需求的启动逻辑,完全剔除不需要的自定义中间件。示例代码如下:
using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; var builder = WebApplication.CreateBuilder(); // 仅添加测试必需的服务,比如控制器、路由等 builder.Services.AddControllersWithViews(); var app = builder.Build(); // 仅配置测试需要的中间件,跳过主项目的自定义中间件 app.UseRouting(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); app.Run(); // 为让WebApplicationFactory能定位到该类,显式声明类(适配顶级语句写法) public partial class TestProgram { }
2. 修改测试代码,使用测试专用Program类
将原测试代码中的WebApplicationFactory<Program>替换为测试项目中创建的TestProgram,这样测试时就会加载这个专用启动类,完全不执行主项目的Program.cs:
public async Task HelloWorldTest() { var application = new WebApplicationFactory<TestProgram>() .WithWebHostBuilder(builder => { // 这里可继续配置测试专属的服务替换、模拟逻辑等 }); var _client = application.CreateClient(); // 注意:请求地址需用相对路径,修正原代码中的格式错误 var response = await _client.GetAsync("/home"); }
额外注意事项
- 如果主项目的
Program.cs使用顶级语句写法,默认不会生成可被外部引用的类,因此测试专用Program需要显式声明类(如示例中的public partial class TestProgram { }),确保WebApplicationFactory能正确定位。 - 测试专用Program的逻辑可根据测试场景灵活调整,比如只注册必要服务、简化中间件管道,甚至添加测试专属的模拟服务。
内容的提问来源于stack exchange,提问作者DavidJS
相关产品推荐
相关产品推荐

