在单元测试中模拟HttpClient

在单元测试中模拟HttpClient,第1张

在单元测试中模拟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
类被抽象化了。

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



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5499099.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存