[英]Unit testing a REST client
我对单元测试相当新,但我正在尝试将其合并到我编写的任何新代码(包括错误修复)的开发过程中。
我正在使用REST客户端与Highrise(37Signals)进行通信。 如何在不依赖外部依赖的情况下对此进行单元测试? (REST服务)。
例如,我将有一个名为GetPeople()
的方法
我想要进行单元测试的事情......
我该怎么做才能测试该服务的功能是否相同。 IE用户还有名字吗? 我可以对此进行单元测试,还是更多的集成测试?
对于那些试图测试实际的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
该方法:
我假设您的代码现在直接使用HttpWebRequest
和HttpWebResponse
。 如果是这种情况,用IRequest
替换所有出现的HttpWebRequest
和用IResponse
替换HttpWebResponse
。 定义了这两个接口并公开了您需要的属性和方法,如下所示:
public interface IRequest
{
IResponse GetResponse(string url);
IResponse GetResponse(string url, object data);
}
public interface IResponse
{
Stream GetStream();
}
然后它只是两次实现这些接口; 一次用于真正的应用程序(使用HttpWebRequest
和HttpWebResponse
来执行HTTP操作)和一次用于测试(不使用HTTP,而是可能写入控制台,日志或类似的东西)。
然后,在实例化您的客户端时,只需注入您想要的IRequest
实现:
var realClient = new Client(new MyHttpRequest());
var testClient = new Client(new MyTestRequest());
对与外部REST API交互的单元测试代码来说,这是一个非常常见的要求。 模拟API服务器实际上通常很烦人,因为大多数Web框架需要大量配置才能开始模拟端点。 例如NancyFX和Asp.net。
除此之外,断言发送到服务器的数据可能非常困难 - 这实际上意味着您只能检查响应是否正确处理。
即使在真实端点上进行集成测试,也无法测试当您使用的API发生故障时会发生什么情况,或者输出异常状态代码,因为您无法控制端点。
经过很长一段时间试图找到这个问题的解决方案后,我决定使用基于内置HttpListener类的真实Web服务器编写一个用于模拟API端点的库。
https://github.com/paulmorrishill/FluentSimulator
该库支持模拟端点,标头,响应,响应缓慢,响应失败。 HTTP端点上可能发生的每种类型的事件。
它还允许声明发送到服务器的数据完全符合您的预期。
这是使用模拟对象的教科书示例。 所以你要做的就是实现一个模拟你期望的行为的假服务器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.