.NET Core集成测试中通过ServiceCollection模拟Typed HttpClient的方法咨询
模拟Typed HttpClient的实现方案
你不需要完整模拟IHttpClientFactory,有两种常用的替换方案:
方案1:直接覆盖Typed Client注册
这是最贴近你提到的替换IFoo逻辑的方案。AddHttpClient本质是把ITestApiClient的注册指向了从HttpClientFactory获取HttpClient再构造TestApiClient的逻辑,你直接覆盖这个服务注册即可:
// 先用你熟悉的Mock库构造模拟的HttpClient var mockHttp = new MockHttpMessageHandler(); mockHttp.When("https://reqres.in/api/users?page=2") .Respond("application/json", "{\"data\": []}"); var mockHttpClient = mockHttp.ToHttpClient(); // 直接覆盖ITestApiClient的注册,手动传入模拟的HttpClient services.AddSingleton<ITestApiClient>(new TestApiClient(mockHttpClient));
注意:覆盖注册要放在原服务注册(也就是AddHttpClient的代码)之后执行,ASP.NET Core DI默认会取最后注册的实现作为有效实现
方案2:替换指定Typed Client的HttpClient配置(更适合集成测试)
Typed HttpClient在注册时会默认用实现类的全名作为HttpClient的名称,你可以直接修改对应名称的HttpClient构造逻辑,注入模拟的消息处理器:
// 构造模拟消息处理器 var mockHttp = new MockHttpMessageHandler(); mockHttp.When("https://reqres.in/api/users?page=2") .Respond("application/json", "{\"data\": []}"); // 为TestApiClient对应的HttpClient配置模拟处理器 services.AddHttpClient<TestApiClient>() .ConfigurePrimaryHttpMessageHandler(() => mockHttp);
这个方案你完全不需要手动构造TestApiClient实例,DI容器会自动用你配置的模拟HttpClient来构造实例,和正式环境的构造逻辑完全一致,也不需要额外处理TestApiClient的其他依赖注入。
两种方案的选择:如果你的
TestApiClient还有其他依赖需要从DI容器获取,优先选方案2;如果只是简单测试TestApiClient本身,方案1更直观。
内容的提问来源于stack exchange,提问作者user7368874
相关产品推荐
相关产品推荐

