这是文档https://learn.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()?
发布于 2020-01-15 11:02:38
当做单元测试时,我不需要用Moq来模拟它,这不是更好吗?
不不是的。单元测试的全部目的是在没有依赖项的情况下测试单元。在这种情况下,没有要连接到的实际服务器。
假设您的客户端有一个单元测试--实际获取数据,以及一个单元测试--当您的客户端无法获得数据时,您就无法合理地用您的方式进行这种测试。
您需要模拟它,以便能够为您的http调用的不同结果提供多个测试用例。
发布于 2020-01-15 11:06:09
除了已经提出的UnitTesting点之外,您链接的文档指定了直接使用IHttpClientFactory来安装新HttpClient的主要原因之一:
管理底层HttpClientMessageHandler实例的池和生存期。自动管理避免了手动管理HttpClient生存期时出现的常见DNS (域名系统)问题。
https://stackoverflow.com/questions/59749937
复制相似问题