我对单元测试相当新,但我正在尝试将其合并到我编写的任何新代码(包括错误修复)的开发过程中。
我正在使用REST客户端与Highrise(37Signals)进行通信。如何在不依赖外部依赖的情况下对此进行单元测试? (REST服务)。
例如,我将有一个名为的方法 GetPeople()
我想要进行单元测试的事情......
- 该方法返回帐户中正确的人数。
- 如果帐户中没有人,则该方法返回null
- 如果该方法无法连接到该服务,则会抛出异常。
我该怎么做才能测试该服务的功能是否相同。 I.E人还有名字吗?我可以对此进行单元测试,还是更多的集成测试?
我假设您的代码现在使用 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,而是写入控制台,日志或类似的东西)。
然后,在实例化您的客户端时,它只是注入实现 IRequest
你要:
var realClient = new Client(new MyHttpRequest());
var testClient = new Client(new MyTestRequest());
我假设您的代码现在使用 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,而是写入控制台,日志或类似的东西)。
然后,在实例化您的客户端时,它只是注入实现 IRequest
你要:
var realClient = new Client(new MyHttpRequest());
var testClient = new Client(new MyTestRequest());
这是使用a的教科书示例 模拟对象。所以你要做的就是实现一个假的服务器来模拟你期望的行为。
对与外部REST API交互的单元测试代码来说,这是一个非常常见的要求。模拟API服务器实际上通常很烦人,因为大多数Web框架需要大量配置才能开始模拟端点。例如NancyFX和Asp.net。
除此之外,断言发送到服务器的数据真的很难 - 实际上意味着您只能检查响应是否正确处理。
即使在真实端点上进行集成测试,也无法测试当您使用的API发生故障时会发生什么情况,或者输出异常状态代码,因为您无法控制端点。
经过很长一段时间试图找到这个问题的解决方案后,我决定使用基于内置HttpListener类的真实Web服务器编写一个用于模拟API端点的库。
https://github.com/paulmorrishill/FluentSimulator
此库支持模拟端点,标头,响应,响应缓慢,响应失败。 HTTP端点上可能发生的每种类型的事件。
它还允许声明发送到服务器的数据完全符合您的预期。