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

.NET Core 6中WebApplicationFactory调用控制器始终返回404

.NET Core 6集成测试返回404的解决方法

以下是针对你遇到问题的具体排查和解决步骤:

  • 检查InternalsVisibleTo的放置位置
    确保[assembly: InternalsVisibleTo("constructionCompanyAPI.IntegrationTests")]放在Program.cs的命名空间外部(.NET 6的Program.cs默认是顶级语句,无命名空间),具体位置在所有using语句之后、var builder = WebApplication.CreateBuilder(args);之前。同时确认测试项目的csproj中<AssemblyName>的值和该特性中的名称完全一致。

  • 验证WebApplicationFactory的配置逻辑
    自定义WebApplicationFactory时,不要在ConfigureWebHost中意外覆盖或破坏路由配置。正确的内存数据库替换示例如下:

    public class ConstructionCompanyTestFactory : WebApplicationFactory<Program>
    {
        protected override void ConfigureWebHost(IWebHostBuilder builder)
        {
            builder.ConfigureServices(services =>
            {
                // 移除原有数据库上下文配置
                var dbDescriptor = services.SingleOrDefault(d => 
                    d.ServiceType == typeof(DbContextOptions<YourDbContext>));
                if (dbDescriptor != null) services.Remove(dbDescriptor);
                
                // 添加内存数据库
                services.AddDbContext<YourDbContext>(options =>
                {
                    options.UseInMemoryDatabase("IntegrationTestDb");
                });
            });
            // 不要添加会重置路由的代码,确保原项目的路由映射逻辑被保留
        }
    }
    

    测试类中使用这个自定义工厂创建HttpClient,避免使用默认工厂导致配置丢失。

  • 确认路由与请求路径的一致性
    检查ConstructionCompanyController的路由属性:

    • 如果用的是[Route("api/[controller]")],则实际路由为/api/ConstructionCompany(注意控制器类名的首字母大写,.NET路由默认区分大小写);
    • 如果是自定义路由如[Route("api/constructionCompany")],则测试请求路径必须完全匹配。
      确保测试代码中的请求路径和控制器路由完全一致。
  • 检查环境相关的路由配置
    查看Program.cs中是否有根据环境条件跳过路由映射的代码,比如:

    // 错误示例:仅开发环境映射控制器
    if (app.Environment.IsDevelopment())
    {
        app.UseSwagger();
        app.UseSwaggerUI();
        app.MapControllers();
    }
    

    集成测试默认使用Testing环境,必须保证app.MapControllers();在所有环境下都执行,不能被环境判断包裹。

  • 调试测试环境的路由端点
    在测试代码中添加调试逻辑,查看启动后注册的路由端点:

    using var scope = factory.Services.CreateScope();
    var endpointSource = scope.ServiceProvider.GetRequiredService<EndpointDataSource>();
    foreach (var endpoint in endpointSource.Endpoints)
    {
        Console.WriteLine(endpoint.DisplayName);
    }
    

    执行测试后,通过输出确认控制器的路由是否被正确注册,如果没有,说明启动流程中路由配置存在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:45:21