1

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

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

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

我怎样才能达到这样的测试?

请让我知道是否有任何丢失的数据。

提前致谢!

编辑

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

4

1 回答 1

1

作为“验收测试”策略的一部分,设置虚拟服务器是一种合法的方法。与单元测试不同,验收测试单独测试单个组件(由许多单元组成),排除任何外部因素,如数据库或后端 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 的使用限制在代码中的一个位置。

于 2016-09-26T13:34:38.740 回答