栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在单元测试中模拟HttpClient

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在单元测试中模拟HttpClient

您的接口公开了具体的

HttpClient
类,因此,使用该接口的所有类都将与其绑定在一起,这意味着无法对其进行模拟。

HttpClient
不会从任何接口继承,因此您必须编写自己的接口。我建议一种 类似装饰器的 模式:

public interface IHttpHandler{    HttpResponseMessage Get(string url);    HttpResponseMessage Post(string url, HttpContent content);    Task<HttpResponseMessage> GetAsync(string url);    Task<HttpResponseMessage> PostAsync(string url, HttpContent content);}

您的课程将如下所示:

public class HttpClientHandler : IHttpHandler{    private HttpClient _client = new HttpClient();    public HttpResponseMessage Get(string url)    {        return GetAsync(url).Result;    }    public HttpResponseMessage Post(string url, HttpContent content)    {        return PostAsync(url, content).Result;    }    public async Task<HttpResponseMessage> GetAsync(string url)    {        return await _client.GetAsync(url);    }    public async Task<HttpResponseMessage> PostAsync(string url, HttpContent content)    {        return await _client.PostAsync(url, content);    }}

所有这些的关键是

HttpClientHandler
创建自己的
HttpClient
,然后您当然可以创建
IHttpHandler
以不同方式实现的多个类。

这种方法的主要问题是,您正在有效地编写一个仅在另一个类中调用方法的类,但是您可以创建一个 继承 自该类的类

HttpClient
(请参阅
Nkosi的示例 ,这比我的方法要好得多)。如果
HttpClient
拥有一个您可以嘲笑的界面,生活会容易得多,但不幸的是,它却没有。

但是,此示例 不是
黄金票。

IHttpHandler
仍然依赖于
HttpResponseMessage
,它属于
System.Net.Http
名称空间,因此,如果您确实需要除以外的其他实现
HttpClient
,则必须执行某种映射以将其响应转换为
HttpResponseMessage
对象。当然,这仅是一个问题,
如果您需要使用的多个实现
IHttpHandler
但看起来却并非如此,这不是世界末日,而是要考虑的问题。

无论如何,您可以简单地进行模拟,

IHttpHandler
而不必担心具体
HttpClient
类被抽象化了。

我建议测试 非异步
方法,因为它们仍然调用异步方法,而不必担心单元测试异步方法的麻烦,请参见此处



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506792.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号