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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:03:14