我对单元测试相当新,但是我正在尝试将它合并到我编写的任何新代码(包括错误修复)的开发过程中。
我正在使用REST客户端与Highrise(37Signals)进行交流。如何在不依赖外部依赖的情况下对此进行单元测试? (REST服务)。
例如,我将有一个名为GetPeople()
我想要进行单元测试......
如何测试该服务的功能是否相同。我的人还有名字吗?我可以对此进行单元测试,还是更多的集成测试?
答案 0 :(得分:4)
我认为您的代码现在直接使用HttpWebRequest
和HttpWebResponse
。如果是这种情况,请将所有HttpWebRequest
替换为IRequest
,将HttpWebResponse
替换为IResponse
。定义了这两个接口并公开了您需要的属性和方法,如下所示:
public interface IRequest
{
IResponse GetResponse(string url);
IResponse GetResponse(string url, object data);
}
public interface IResponse
{
Stream GetStream();
}
然后只是两次实现这些接口;一次用于实际应用程序(使用HttpWebRequest
和HttpWebResponse
执行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
方法:
答案 2 :(得分:1)
这是使用mock object的教科书示例。所以你要做的就是实现一个模拟你期望的行为的假服务器。
答案 3 :(得分:1)
单元测试代码与外部REST API交互是非常普遍的要求。实际上,模拟API服务器真的很烦人,因为大多数Web框架都需要大量的配置才能开始模拟端点。例如NancyFX和Asp.net。
除此之外,要断言发送到服务器的数据确实非常困难-本质上意味着您只能检查响应是否正确处理。
即使在真实端点上进行集成测试,您也无法测试正在使用的API崩溃或输出异常状态代码时会发生什么,因为您无法控制端点。
经过很长时间的努力,我找到了一个解决方案,我决定使用一个基于内置HttpListener类的真实Web服务器编写一个用于模拟API端点的库。
https://github.com/paulmorrishill/FluentSimulator
此库支持模拟端点,标头,响应,慢响应,失败响应。 HTTP端点上可能发生的每种类型的事件。
它还可以断言发送到服务器的数据正是您所期望的。