您的接口公开了具体的
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类被抽象化了。
我建议测试 非异步
方法,因为它们仍然调用异步方法,而不必担心单元测试异步方法的麻烦,请参见此处
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)