ASP.NET Core 3.1集成测试中如何注入CustomWebApplicationFactory<Startup>
问题原因
你遇到的构造函数报错是类型不匹配导致的:
.NET Core 3.1 版本中,WebApplicationFactory<T>的WithWebHostBuilder方法返回值是父类WebApplicationFactory<Startup>类型,而你代码里声明的factory字段是自定义的CustomWebApplicationFactory<Startup>子类类型,直接赋值会触发类型转换失败的报错。
解决方法
- 修正测试类中
factory字段的类型
把factory字段的声明类型从CustomWebApplicationFactory<Startup>改为父类WebApplicationFactory<Startup>即可解决构造函数的报错,修改后的相关代码如下:
// 仅需修改字段类型,其余逻辑不变 private readonly WebApplicationFactory<Startup> factory; private readonly Mock<HttpMessageHandler> githubHandler = new Mock<HttpMessageHandler>(); public ExampleTests(CustomWebApplicationFactory<Startup> factory) { this.factory = factory.WithWebHostBuilder(builder => { builder.ConfigureTestServices(services => { services.AddHttpClient("github") .ConfigurePrimaryHttpMessageHandler(() => githubHandler.Object); }); }); }
- 修复
CustomWebApplicationFactory中的潜在报错
你当前注释掉了ApplicationDBContext的注册逻辑,但后续代码仍然尝试从服务容器中获取该实例,运行时会触发服务未找到的错误:
- 如果你需要用到数据库测试,取消
AddDbContext相关代码的注释即可 - 如果你不需要数据库测试,直接删除
CustomWebApplicationFactory中所有和ApplicationDBContext相关的逻辑即可
内容的提问来源于stack exchange,提问作者Bmoe
相关产品推荐
相关产品推荐

