这是一个问题,只有当我试图写一个测试。在Net 5解决方案中,我使用GetResult()在MyController中测试:
public class MyController : ControllerBase
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _config;
public MyController(IHttpClientFactory httpClientFactory, IConfiguration config)
{
_httpClientFactory = httpClientFactory;
_config = config;
}
public async Task<IActionResult> GetResult(int id)
{
var firstResult = await GetFirstResult(id);
var secondResult = await GetSecondResult(id);
return Ok("")
}
private async Task<int> GetFirstResult(int id)
{
using (var httpClient = _httpClientFactory.CreateClient("MySetting"))
{
var response = await httpClient.GetAsync($"MyUrl1{id}");
return (response.IsSuccessStatusCode ? 0 : 1);
}
}
private async Task<int> GetSecondResult(int id)
{
using (var httpClient = _httpClientFactory.CreateClient("MySetting"))
{
var response = await httpClient.GetAsync($"MyUrl2{id}");
return (response.IsSuccessStatusCode ? 0 : 1);
}
}我的测试:
[Test]
public async Task Get_Should_Return_OK_String()
{
var httpClientFactory = new Mock<IHttpClientFactory>();
var client = new HttpClient();
client.BaseAddress = new Uri("https://sthing/server.php");
httpClientFactory.Setup(_ => _.CreateClient(It.IsAny<string>))).Returns(client);
var config = InitConfiguration();
var controller = new MyController(httpClientFactory.Object, config);
var result = await controller.GetResult(1);
Assert.NotNull(result);
}在返回行(响应.)的GetSecondResult()中抛出一个异常。消息:“无法访问已释放的对象。对象名称:‘System.Net.Http.HttpClient’。”
我知道这个例子是为什么这种HttpClient用法给了我一个“无法访问已释放的对象”。错误?,但是没有使用httpClientFactory。有办法通过工厂将false传递给客户端的构造函数吗?为什么它会在测试之外工作呢?
发布于 2022-05-10 11:37:30
首先,.NET 5今天失去了支持。您应该迁移到.NET 6,这是当前长期支持的版本.这不是一个突然的变化,.NET核心的生命周期是几年前宣布的。在大多数情况下,您需要做的就是将项目中的net5.0更改为net6.0,并更新NuGet包。
至于错误,它是由using块引起的:
using (var httpClient = _httpClientFactory.CreateClient("MySetting"))这是不需要的(实际上是气馁),HttpClient实例和套接字是由HttpClientFactory池和回收的。
测试代码被配置为每次返回相同的HttpClient实例:
var client = new HttpClient();
client.BaseAddress = new Uri("https://sthing/server.php");
httpClientFactory.Setup(_ => _.CreateClient(It.IsAny<string>)))
.Returns(client);对GetFirstResult()的调用将处理此实例,随后的任何使用都会引发
要解决这个问题,请不要使用using。无论如何,HttpClient都应该被重用:
var httpClient = _httpClientFactory.CreateClient("MySetting");https://stackoverflow.com/questions/72185083
复制相似问题