REST客户端单元测试

11

我对单元测试比较新,但我正在尝试将其纳入我的开发流程中,包括修复程序中的错误。

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

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

我想要进行单元测试的事情...

  1. 该方法返回账户中正确数量的人员。
  2. 如果帐户中没有人,则该方法返回null。
  3. 如果无法连接到服务,则该方法会抛出异常。

我该怎么做来测试服务仍然具有相同的功能。例如人员仍然具有名字?我可以进行单元测试吗,还是这更像是集成测试?

4个回答

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,而是可能会写入控制台、日志或类似的工具)。

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

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

什么是Client - Kiquenet
@Kiquenet:无论你的代码中哪个类当前依赖于 HttpWebRequestHttWebResponse,都应该改为依赖于你自定义的 IRequestIResponse 接口。 - Asbjørn Ulsberg
如何对外部 API(如假 API)进行单元测试? https://api.chucknorris.io/ ?https://adamstorr.azurewebsites.net/blog/simple-example-of-calling-rest-api-with-httpclient-in-net5.0 - Kiquenet

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,但你可以使用任何其他的服务器,例如kayak、cassini等。

@Kiquenet 是的,考虑它已经过时了。HttpClient现在是Rest客户端的首选解决方案。Resty.Net应该可以工作,但可能缺少许多现代rest客户端所期望的功能。 - Nripendra
1
使用更好的 RestSharp 还是 Flurl - Kiquenet

4
这是一个非常普遍的需求,需要对与外部REST API交互的代码进行单元测试。模拟API服务器通常非常麻烦,因为大多数Web框架在模拟端点之前需要进行大量配置。例如NancyFX和Asp.net。
除此之外,很难断言发送到服务器的数据 - 这意味着您只能检查响应是否正确处理。
即使在真实端点上进行集成测试,当您使用的API崩溃或输出异常状态代码时,也无法测试发生了什么,因为您无法控制端点。
在长时间寻找解决方案后,我决定编写一个库,使用基于内置HttpListener类的真实Web服务器来模拟API端点。

https://github.com/paulmorrishill/FluentSimulator

这个库支持模拟端点、头部、响应、缓慢响应和失败响应。它支持 HTTP 端点上可能发生的任何类型的事件。

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


1

这是使用模拟对象的教科书式例子。因此,您需要实现一个模拟所期望行为的虚假服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接