您的接口公开了具体的HttpClient@H_403_2@类,因此,使用该接口的所有类都将与其绑定在一起,这意味着无法对其进行模拟。
HttpClient@H_403_2@不会从任何接口继承,因此您必须编写自己的接口。我建议一种 模式:
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);
}
@H_403_2@
您的课程将如下所示:
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);
}
}
@H_403_2@
所有这些的关键是HttpClientHandler@H_403_2@创建自己的
HttpClient@H_403_2@,然后您当然可以创建
IHttpHandler@H_403_2@以不同方式实现的多个类。
这种方法的主要问题是,您正在有效地编写一个仅在另一个类中调用方法的类,但是您可以创建一个 自该类的类HttpClient@H_403_2@(请参阅 ,这比我的方法要好得多)。如果
HttpClient@H_403_2@拥有一个您可以嘲笑的界面,生活会容易得多,但不幸的是,它却没有。
但是,此示例 黄金票。IHttpHandler@H_403_2@仍然依赖于
HttpResponseMessage@H_403_2@,它属于
System.Net.Http@H_403_2@名称空间,因此,如果您确实需要除以外的其他实现
HttpClient@H_403_2@,则必须执行某种映射以将其响应转换为
HttpResponseMessage@H_403_2@对象。当然,这仅是一个问题, ,
IHttpHandler@H_403_2@但看起来却并非如此,这不是世界末日,而是要考虑的问题。
无论如何,您可以简单地进行模拟,IHttpHandler@H_403_2@而不必担心具体
HttpClient@H_403_2@类被抽象化了。