栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > 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号