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

ASP.NET Core 6 Minimal APIs集成测试中如何重写Host配置

Minimal API 集成测试自定义Host配置方案

你遇到的报错本质是重写CreateHostBuilder后,框架找不到Minimal API的启动逻辑导致的,不需要退回Startup模型,下面两种方案都可以直接解决问题:

方案一:增量修改原有Host配置(推荐,改动最小)

不需要完全重写整个Host构建流程,只需要在自定义WebApplicationFactory中拦截不需要的服务和配置源即可,不会破坏Minimal API默认的启动逻辑。

  1. 你的API项目Program.cs保持Minimal API写法即可,只保留测试访问需要的公开配置(你之前已经配置的partial Program、InternalsVisibleTo不需要改动):
var builder = WebApplication.CreateBuilder(args);
// 生产环境正常注册ConfigServer
builder.Host.AddConfigServer();
// 其他服务、中间件配置按业务正常写
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();

public partial class Program { }
  1. 测试项目中自定义WebApplicationFactory,重写ConfigureWebHost方法移除不需要的配置和服务:
public class MyWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        // 移除ConfigServer配置源
        builder.ConfigureAppConfiguration((_, configBuilder) =>
        {
            var configServerSource = configBuilder.Sources
                .FirstOrDefault(s => s.GetType().Name.Contains("ConfigServer"));
            if (configServerSource != null)
            {
                configBuilder.Sources.Remove(configServerSource);
            }
        });
        // 如果需要替换/移除相关服务,用ConfigureTestServices注册即可,后注册的服务会覆盖原有注册
        builder.ConfigureTestServices(services =>
        {
            // 示例:移除ConfigServer相关服务注册,替换为Mock实现
            // services.RemoveAll<IConfigServerClient>();
            // services.AddSingleton<IConfigServerClient, MockConfigClient>();
        });
    }
}

方案二:完全自定义Host构建流程

如果你需要和之前Startup模式一样完全控制Host构建逻辑,只需要在配置WebHost时指定启动程序集,就能解决No application configured的报错:

public class MyWebApplicationFactory : WebApplicationFactory<Program>
{
    protected override IHostBuilder CreateHostBuilder() =>
        Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                // 关键:指定Minimal API所在的启动程序集,框架会自动加载你的Top-level Statements启动逻辑
                webBuilder.UseSetting(
                    WebHostDefaults.StartupAssemblyKey, 
                    typeof(Program).Assembly.FullName
                );
                // 此处不要调用AddConfigServer,其余需要的配置按需添加
            });
}

注意:该方案需要手动同步所有服务注册、中间件配置逻辑,容易漏配,非必要不选。

报错原因说明

传统Startup模式下重写CreateHostBuilder时,你显式调用了UseStartup<Startup>(),框架可以定位到应用的配置逻辑;但Minimal API模式下没有Startup类,框架默认会通过入口程序集查找Top-level Statements编写的启动逻辑,你完全重写Host构建流程后没有指定启动程序集,框架找不到任何应用配置入口,就会抛出对应异常。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:09:19