在 asp.net core integration testing 中,测试的目标 web 项目的 Program 中已经注册了 HttpClient,集成测试中需要用 HttpClient mock 覆盖已经注册的 HttpClient,请问如何实现?
自定义class 集成 WebApplicationFactory.
完了在对于的override method 里面在重新注册要mock的东东.
[CollectionDefinition("WebFactory")]
public class MyWebApplicationFactory : WebApplicationFactory<Program>, ICollectionFixture<MyWebApplicationFactory >
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
base.ConfigureWebHost(builder);
// replace mock object
builder.ConfigureServices(services => { })
}
}
重新注册不能覆盖已有注册
@dudu: services.replace。
如果是类似httpclient 拿到httpclientbuilder 然后clear里面注册的configure action 或者任何想clear的东西
也可以mock一个自己的httpclien factory替换系统的 在之后想咋弄都由你
@czd890: 原来直接对 IServiceCollection
进行增删查改就可以了,services.Replace
实际就是先删除后添加,services.RemoveAll
可以删除所有 HttpClient 的注册
public class ZzkApiTestFactory : WebApplicationFactory<Program>
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
base.ConfigureWebHost(builder);
builder.ConfigureServices(services =>
{
services.RemoveAll<HttpClient>();
});
}
}