单元测试REST客户端

时间:2011-09-09 14:15:34

标签: c# unit-testing rest mocking

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

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

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

的方法

我想要进行单元测试......

  1. 该方法会返回帐户中正确的人数。
  2. 如果帐户中没有人
  3. ,则该方法返回null
  4. 如果该方法无法连接到该服务,则会抛出异常。
  5. 如何测试该服务的功能是否相同。我的人还有名字吗?我可以对此进行单元测试,还是更多的集成测试?

4 个答案:

答案 0 :(得分:4)

我认为您的代码现在直接使用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,而是写入控制台,日志或类似内容)。< / p>

然后,在实例化您的客户端时,只需注入您想要的IRequest实现:

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

答案 1 :(得分:4)

对于那些试图测试实际的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,但你可以使用任何例如皮划艇,卡西尼等。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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

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

经过很长时间的努力,我找到了一个解决方案,我决定使用一个基于内置HttpListener类的真实Web服务器编写一个用于模拟API端点的库。

https://github.com/paulmorrishill/FluentSimulator

此库支持模拟端点,标头,响应,慢响应,失败响应。 HTTP端点上可能发生的每种类型的事件。

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