如何测试对 REST 服务的调用

How to test a call to a REST service

我设置了一个为客户端提供多个端点的服务器,我有一个客户端使用 node-rest-client 包将 post 数据传送到后端。

我想为客户端编写一些单元测试,确保数据正确发送到端点。

我一直在考虑为测试设置一个虚拟服务器,但感觉不对。

我怎样才能完成这样的测试?

如果有任何遗漏的数据,请告诉我。

提前致谢!

编辑

我一直在查看 supertest 包,但看起来这是用来测试 REST API 服务本身而不是测试来自客户端的 REST 调用

作为您的 "Acceptance Testing" 策略的一部分,设置虚拟服务器是一种合法的方法。与单元测试不同,验收测试隔离地测试单个组件(由许多单元组成),排除任何外部因素,如数据库或后端 HTTP 服务。如果您想测试客户端作为一个整体如何与后端 HTTP 服务交互,那么拥有一个虚拟服务器可能是一个不错的方法。验收测试通常比单元测试覆盖面更广,数量更少,速度也更慢。这就是为什么可以启动虚拟 HTTP 服务器的原因。

但是,如果您真的想对调用服务器的单个 javascript 单元进行单元测试,那么这实际上可能有点棘手。您不想在单元测试中启动真正的 HTTP 服务器,因为这会使它们变慢并且无法并行 运行。

最佳方法取决于您使用的技术。例如,AngularJS 提供了一种称为 $httpBackend 的单元测试 HTTP 调用的方法。从本质上讲,它 一个虚拟的 HTTP 服务器,但它实际上并不通过 HTTP(所有请求都保留在内存中)。这是可能的,因为 Angular 团队将可测试性视为优先事项,并以这种方式从头开始设计。

我不认为 node-rest-client 提供了类似的模拟 HTTP 服务器,因此可能很难对您的客户端进行单元测试。最好的方法可能是将 node-rest-client 的所有用法包装在一个独立的 javascript 对象中,该对象本身没有单元测试,但很容易在客户端代码的其他部分的单元测试中模拟出来。然后可以将这个未经过单元测试的对象作为单独测试套件的一部分针对虚拟 HTTP 服务器进行测试,或者您甚至可以依靠集成测试来捕获这部分的任何问题。

一如既往,最好将您对集成测试(连接到后端的实际实例)的依赖保持在最低限度,因为它们速度慢且不可靠。这些测试实际上应该只用于验证顶级细节,例如性能、连接细节、配置兼容性等。

如果采用包装方法,包装器中的逻辑越少越好,因为它不会经过单元测试!

请注意,无论您的测试策略如何,将所有 HTTP 调用包装在 javascript 服务对象中可能是一个很好的做法,因为它会将 node-rest-client 的所有用法限制在代码中的一个位置。