首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Net 5单元测试多次使用httpClientFactory

Net 5单元测试多次使用httpClientFactory
EN

Stack Overflow用户
提问于 2022-05-10 10:56:15
回答 1查看 350关注 0票数 0

这是一个问题,只有当我试图写一个测试。在Net 5解决方案中,我使用GetResult()在MyController中测试:

代码语言:javascript
复制
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);
        }
    }

我的测试:

代码语言:javascript
复制
    [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传递给客户端的构造函数吗?为什么它会在测试之外工作呢?

EN

回答 1

Stack Overflow用户

发布于 2022-05-10 11:37:30

首先,.NET 5今天失去了支持。您应该迁移到.NET 6,这是当前长期支持的版本.这不是一个突然的变化,.NET核心的生命周期是几年前宣布的。在大多数情况下,您需要做的就是将项目中的net5.0更改为net6.0,并更新NuGet包。

至于错误,它是由using块引起的:

代码语言:javascript
复制
using (var httpClient = _httpClientFactory.CreateClient("MySetting"))

这是不需要的(实际上是气馁),HttpClient实例和套接字是由HttpClientFactory池和回收的。

测试代码被配置为每次返回相同的HttpClient实例:

代码语言:javascript
复制
 var client = new HttpClient();
 client.BaseAddress = new Uri("https://sthing/server.php");
 httpClientFactory.Setup(_ => _.CreateClient(It.IsAny<string>)))
                  .Returns(client);

GetFirstResult()的调用将处理此实例,随后的任何使用都会引发

要解决这个问题,请不要使用using。无论如何,HttpClient都应该被重用:

代码语言:javascript
复制
var httpClient = _httpClientFactory.CreateClient("MySetting");
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72185083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档