WebApplicationFactory的ConfigureWebHost方法未调用问题(MSTest环境)
问题:MSTest中自定义WebApplicationFactory的ConfigureWebHost未被调用的原因及解决办法
问题原因
你的测试类同时做了两件冲突的事:
- 继承了
CustomWebApplicationFactory<Program> - 在构造函数中注入了
CustomWebApplicationFactory<Program>实例
实际运行时,你使用的是注入的factory对象,而非继承的那个。导致继承的factory里重写的ConfigureWebHost方法从未被触发,自然断点不会命中。
解决办法
方案一:移除构造函数注入,直接用继承的Factory实例
修改测试类,去掉构造函数,直接通过当前类实例创建测试客户端:
[TestClass] public class TransactionTest : CustomWebApplicationFactory<Program> { [TestMethod] public async Task Only_existing_users_can_transact() { // 用当前实例创建测试客户端,触发ConfigureWebHost执行 var client = CreateClient(); var requestParam = new MyRequest { phone = "12345678", }; // ... 后续请求发送、断言逻辑 } }
当调用CreateClient()时,CustomWebApplicationFactory中的ConfigureWebHost方法会被自动触发,断点即可命中。
方案二:测试类不继承Factory,改用构造函数注入
如果偏好构造函数注入的方式,测试类不要继承Factory,同时确保测试项目使用的MSTest框架支持构造函数注入(需安装最新版MSTest.TestFramework包):
[TestClass] public class TransactionTest { private readonly HttpClient _client; public TransactionTest(CustomWebApplicationFactory<Program> factory) { _client = factory.CreateClient(); } [TestMethod] public async Task Only_existing_users_can_transact() { var requestParam = new MyRequest { phone = "12345678", }; // ... 后续请求发送、断言逻辑 } }
这种方式下,调用factory.CreateClient()时会触发ConfigureWebHost方法。
额外注意事项
- 确保
CustomWebApplicationFactory是public访问级别,且Program类在测试项目中可访问(如果ASP.NET Core项目的Program.cs用了顶级语句,需要在主项目的.csproj中添加<InternalsVisibleTo>测试项目名称</InternalsVisibleTo>)。 ConfigureWebHost仅在创建测试主机/客户端时触发,所以必须确保测试代码中调用了CreateClient()或Server相关方法。
内容的提问来源于stack exchange,提问作者Isaac Ikusika
相关产品推荐
相关产品推荐

