您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在单元测试中模拟HttpClient

在单元测试中模拟HttpClient

您的接口公开了具体的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@类被抽象化了。

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

其他 2022/1/1 18:20:25 有455人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶