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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:34:59