.NET Core 6中WebApplicationFactory调用控制器始终返回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

