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

ASP.NET Core集成测试访问WebApplicationFactory.Server.Host报错原因咨询

问题:访问WebApplicationFactory的Server.Host时抛出异常

在集成测试中使用Microsoft.AspNetCore.Testing.WebApplicationFactory<Startup>,尝试访问_fixture.Server.Host属性时抛出异常:

The TestServer constructor was not called with a IWebHostBuilder so IWebHost is not available

测试代码如下:

public class OneTest:IClassFixture<WebApplicationFactory<Startup>>{
    private readonly WebApplicationFactory<Startup> _fixture;
    public OneTest(WebApplicationFactory<Startup> fixture){
        _fixture=fixture;
    }
    [Fact]
    public async Task TestCanBeAuthenticated(){
        var host=_fixture.Server.Host; // 抛出异常的位置
        // ... 其他代码 ...
    }
    
}

原因分析

  • 默认的WebApplicationFactory实现依赖ASP.NET Core 6+引入的WebApplicationBuilder模式初始化测试服务器,而非传统的IWebHostBuilder,导致Server.Host属性未被正确赋值,直接访问就会触发异常。
  • Server.Host是基于旧版IWebHost架构的属性,在采用新WebApplication/最小API模式的项目中,该属性不会被填充。

解决方案

方案1:通过Services获取所需服务(推荐)

如果你的目标只是访问主机内的服务,无需直接获取IWebHost实例,直接从_fixture.Services中提取即可:

var myService = _fixture.Services.GetRequiredService<IMyService>();

方案2:自定义WebApplicationFactory使用IWebHostBuilder

如果确实需要IWebHost实例,可以自定义工厂类强制使用传统构建方式:

public class CustomWebApplicationFactory : WebApplicationFactory<Startup>
{
    protected override IWebHostBuilder CreateWebHostBuilder()
    {
        return WebHost.CreateDefaultBuilder()
                      .UseStartup<Startup>();
    }
}

然后测试类替换为使用该自定义工厂:

public class OneTest:IClassFixture<CustomWebApplicationFactory>{
    private readonly CustomWebApplicationFactory _fixture;
    public OneTest(CustomWebApplicationFactory fixture){
        _fixture=fixture;
    }
    [Fact]
    public async Task TestCanBeAuthenticated(){
        var host=_fixture.Server.Host; // 可正常访问
        // ... 其他代码 ...
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:10:49