.NET 8集成测试使用TestStartup.cs出现404错误求助
.NET 8 ASP.NET Core Web API 集成测试404问题排查
问题背景
已升级至.NET 8的ASP.NET Core Web API项目,计划用xUnit添加集成测试,延续此前使用Startup.cs的模式,通过TestStartup.cs类管理并注入Mock外部依赖。但使用TestStartup.cs作为启动类测试控制器时,接口返回404错误;替换为实际Startup.cs则正常,两者仅在依赖注入部分存在Mock实现的差异。
相关代码片段
Program.cs
public static void Main(string[] args) { MyHost.Start<Startup>(args); } public static class MyHost { public static void Start<TStartup>(string[] args, ....) where TStartup: class { CreateWebHostBuilder<TStartup>(args ,......) .Build().Run(); } private static IWebHostBuilder CreateWebHostBuilder<TStartup>(string[] args, ...) where TStartup : class => WebHost.CreateDefaultBuilder(args) .UseStartup<TStartup>() .ConfigureLogging(....) .ConfigureAppConfiguration(...); }
Startup.cs
public class Startup { public void ConfigureServices(IServiceCollection services) { // 实际服务注册逻辑 } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 中间件配置逻辑 } }
TestStartup.cs
为
Startup.cs的完整副本,仅将部分服务替换为Mock实现注册。
自定义WebApplicationFactory
public class CustomApplicationFactory: WebApplicationFactory<TestStartup> // 替换为Startup则正常 { protected override IWebHostBuilder CreateWebHostBuilder() { return WebHost.VreateDefaultBuilder() .UseStartup<TestStartUp>() // 替换为Startup则正常 .ConfigureLogging() .ConfigureAppConfiguration(); } }
测试类
public class MyTest { private readonly HttpClient _client; private readonly CustomApplicationFactory _factory; public MyTest() { _client = _factory.CreateClient(); } [Fact] public async Task MyTestMethod() { // 使用_client准备/发送请求并断言的代码 // 指向Startup.cs时正常,指向TestStartup.cs时返回404(控制器方法未被命中) } }
原因排查及解决方法
1. 代码拼写错误
从提供的CustomApplicationFactory代码中发现两处大小写/拼写错误:
WebHost.VreateDefaultBuilder()→ 正确写法为WebHost.CreateDefaultBuilder().UseStartup<TestStartUp>()→ 类名实际为TestStartup(C#是大小写敏感语言,类名大小写不匹配会导致无法加载启动类)
修复这两处错误后,测试环境才能正确识别并加载TestStartup。
2. TestStartup遗漏路由相关配置
即使TestStartup是Startup的副本,仍可能遗漏控制器路由的核心配置:
- 检查
TestStartup.ConfigureServices是否调用了services.AddControllers()或services.AddMvc()(注册控制器服务) - 检查
TestStartup.Configure是否调用了app.UseRouting()和app.UseEndpoints(endpoints => endpoints.MapControllers())(配置路由中间件)
上述配置缺失会导致测试环境无法识别控制器路由,直接返回404。
3. WebApplicationFactory泛型参数问题
WebApplicationFactory<TEntryPoint>的泛型参数需要指向项目的入口类(通常是Program),而非单独的TestStartup。如果泛型参数仅指定TestStartup,测试环境可能无法正确扫描主项目中的控制器程序集。
调整后的CustomApplicationFactory示例:
public class CustomApplicationFactory: WebApplicationFactory<Program> { protected override IWebHostBuilder CreateWebHostBuilder() { return WebHost.CreateDefaultBuilder() .UseStartup<TestStartup>() .ConfigureLogging(logging => logging.ClearProviders()) .ConfigureAppConfiguration(config => { // 可添加测试专属配置 }); } }
4. 测试类初始化问题
原测试类中_factory未实例化,会导致空引用异常,修复如下:
public MyTest() { _factory = new CustomApplicationFactory(); _client = _factory.CreateClient(); }
5. 控制器可访问性检查
确保主项目中的控制器类为public修饰,未被错误标记[NonController]特性,且测试项目已正确引用主API项目。
内容的提问来源于stack exchange,提问作者aks
相关产品推荐
相关产品推荐

