这是文档https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-3.1 我们可以看到IHttpClientFactory已注册:
services.AddHttpClient();
以及将其消耗为的模型类:
public BasicUsageModel(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task OnGet()
{
...
var client = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
...
}
但是我们不注册它,而只是为其创建一个新实例:
public async Task OnGet()
{
...
var client = new HttpClient();
var response = await client.SendAsync(request);
...
}
这样BasicUsageModel
的构造函数不需要接受任何参数,并且在进行单元测试时,我不需要使用Moq来模拟它,是不是更好? >
对于第一种情况,如何在不实际发送请求的情况下模拟IHttpClientFactory
来测试OnGet()
?
答案 0 :(得分:0)
当进行单元测试时,我不需要使用Moq来模拟它,那再好不过了
不,不是。 unit 测试的全部要点是在没有依赖关系的情况下测试该单元。在这种情况下,没有实际的服务器可以连接。
假设您有一个针对客户端实际获取数据的单元测试,以及针对一个客户端未能获取数据的单元测试,那么您将无法用自己的方式合理地做到这一点。
您需要对其进行模拟,以便能够针对您的http调用的不同结果提供多个测试用例。
答案 1 :(得分:0)
除了已经提到的UnitTesting点之外,链接的文档还指定了使用IHttpClientFactory
而不是直接将新的HttpClient
实例化的主要原因之一。
管理基础HttpClientMessageHandler实例的池化和生存期。自动管理避免了手动管理HttpClient生存期时出现的常见DNS(域名系统)问题。