【问题标题】:Unit testing a REST client对 REST 客户端进行单元测试
【发布时间】:2011-09-09 14:15:33
【问题描述】:

我对单元测试还很陌生,但我正在尝试将它整合到我编写的任何新代码(包括错误修复)的开发过程中。

我正在使用 REST 客户端与 Highrise (37Signals) 进行通信。如何在不依赖外部依赖的情况下对其进行单元测试? (REST 服务)。

例如,我将有一个名为 GetPeople() 的方法

我要进行单元测试的东西...

  1. 该方法返回帐户中正确的人数。
  2. 如果帐户中没有人,该方法返回 null
  3. 如果无法连接到服务,该方法将引发异常。

我该怎么做才能测试服务的功能是否仍然相同。 I.E 人还有名字吗?我可以对此进行单元测试还是这更像是一个集成测试?

【问题讨论】:

    标签: c# unit-testing rest mocking


    【解决方案1】:

    我假设您的代码现在直接使用HttpWebRequestHttpWebResponse。如果是这种情况,请将所有出现的HttpWebRequest 替换为IRequest,并将HttpWebResponse 替换为IResponse。定义了这两个接口并暴露了你需要的属性和方法,像这样:

    public interface IRequest
    {
        IResponse GetResponse(string url);
        IResponse GetResponse(string url, object data);
    }
    
    public interface IResponse
    {
        Stream GetStream();
    }
    

    那么就是实现这些接口两次;一次用于真正的应用程序(使用 HttpWebRequestHttpWebResponse 进行 HTTP 操作),一次用于测试(不使用 HTTP,而是可能写入控制台、日志或类似的东西)。

    那么,在实例化你的客户端的时候,就是注入你想要的IRequest的实现了:

    var realClient = new Client(new MyHttpRequest());
    var testClient = new Client(new MyTestRequest());
    

    【讨论】:

    • Client 是什么?
    • @Kiquenet:您的代码中的任何类当前依赖于HttpWebRequestHttWebResponse,但应该依赖于您的自定义IRequestIResponse 接口。
    【解决方案2】:

    适用于所有尝试测试实际 HttpWebRequest 和 HttpWebResponse,而不是模拟的人。我在这里提到了一种方法:http://nripendra-newa.blogspot.com/2012/10/testing-rest-clients.html。不过,我将其称为集成测试而不是单元测试。实际实现请参考这里:https://github.com/nripendra/Resty.Net/blob/master/tests/Resty.Net.Tests/RestRequestTest.cs

    方法:

    • 使用嵌入式 Web 服务器。我用过 NancyFx,但你可以使用任何例如皮划艇、卡西尼等。

    【讨论】:

    • @Kiquenet 是的,认为它过时的 HttpClient 现在或多或少地成为 Rest 客户端的解决方案。 Resty.Net 应该可以工作,但可能缺少现代休息客户端所期望的许多功能。
    • 使用更好的RestSharp or Flurl ?
    【解决方案3】:

    对与外部 REST API 交互的代码进行单元测试是非常常见的要求。设置模拟 API 服务器实际上真的很烦人,因为大多数 Web 框架需要大量配置才能开始模拟端点。例如 NancyFX 和 Asp.net。

    除此之外,很难断言发送到服务器的数据 - 本质上意味着您只能检查响应是否被正确处理。

    即使在真实端点上进行集成测试,您也无法测试当您使用的 API 出现故障或输出异常状态代码时会发生什么,因为您无法控制端点。

    经过很长时间试图找到解决此问题的方法后,我决定编写一个库,用于使用基于内置 HttpListener 类的真实 Web 服务器来模拟 API 端点。

    https://github.com/paulmorrishill/FluentSimulator

    该库支持模拟端点、标头、响应、慢速响应、失败响应。可以在 HTTP 端点上发生的每种类型的事件。

    它还允许断言发送到服务器的数据正是您所期望的。

    【讨论】:

      【解决方案4】:

      这是使用mock object 的教科书示例。所以你要做的就是实现一个假的服务器来模拟你所期望的行为。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-12
        • 1970-01-01
        • 2016-03-27
        • 2012-08-16
        相关资源
        最近更新 更多