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
相关产品推荐
相关产品推荐

