为什么节点似乎没有任何强大的HTTP服务器模拟包?(或者有?



我对 Node.js 很陌生,所以我可能只是不明白,但是经过相当多的搜索,并尝试了几种不同的解决方案,我仍然无法找到一种体面的方式来模拟使用 Node 进行验收测试的 API 响应。

我有一个与 API 交互的 javascript 应用程序(实际上是用 elm 编写的)(我想很常见),我想编写一些验收测试......所以我用硒和摩卡设置了WebdriverIO,编写了一些测试,当然现在我需要模拟一些API响应,以便我可以设置一些理论场景进行测试。

mock-api-server:看起来不错,但是没有办法调整从服务器发回的标头!

mock-http-server:看起来也不错,让我调整标头,但是没有办法在不关闭整个服务器的情况下重置模拟响应......!?这有问题,因为当浏览器窗口仍然打开时服务器不会关闭,所以这意味着我必须关闭并重新设置浏览器才能清除模拟!

json-server:模拟某些响应的简单而体面的方法,但它完全依赖于磁盘上的文件来获取响应。 我想要一些可以从测试运行中配置的东西,而无需将文件读取和写入磁盘。

我错过了什么吗? 这难道不是人们在Node宇宙中进行验收测试的方式吗? 是否每个人都只为整个测试套件使用一组固定的模拟数据? 这对我来说听起来很疯狂...特别是因为基于具有所有必要功能的快速服务器编写一个好的似乎并不难......它存在吗?

必要功能:

  1. 服务器可以从javascript配置和启动
  2. 响应(包括标头)可以动态配置
  3. 响应也可以即时轻松重置,而无需关闭服务器。

我也遇到了这个问题,所以我建立了一个:https://github.com/pimterry/mockttp

就您正在寻找的东西而言,Mockttp:

  • 允许您在测试运行期间从JS动态启动和重新配置服务器,没有静态文件。
  • 允许您调整标题
  • 允许您重置正在运行的服务器(尽管我建议无论如何关闭并重新启动 - 使用Mockttp,只需几毫秒,清晰且易于自动化,并为您提供一些很好的保证)

最重要的是,它:

  • 可以从具有相同代码的Node和浏览器进行配置,因此您可以进行通用测试
  • 可以并行处理正在运行的测试,以便更快地进行测试
  • 可以伪造HTTPS服务器,自动自签名证书
  • 可以模拟为拦截代理
  • 有一堆很好的调试支持,当出现问题时(例如,不匹配的请求返回当前配置的可读解释,以及使请求成功的示例代码)

只是为了快速评论其他建议在过程中进行测试的帖子:我真的不会。部分原因是一大堆限制(你被绑定到一个特定的环境,甚至可能是特定的节点版本,你必须模拟整个过程,所以没有并行测试,你不能模拟子进程),但主要是因为它没有真正的代表性。只需非常非常小的速度成本,您就可以使用真正的HTTP进行测试,并且知道您的请求和响应在现实中也肯定会起作用。

这不是人们在 Node 宇宙中进行验收测试的方式吗?是否每个人都只为整个测试套件使用一组固定的模拟数据?

不。您无需发出实际的 HTTP 请求即可测试您的应用程序。

所有好的测试框架都允许您通过运行路由和处理程序来伪造 HTTP,而无需发出网络请求。你也可以模拟向外部API发出实际HTTP请求的函数,这些函数应该首先被抽象出来,所以这里也不需要发生实际的HTTP请求。

如果这还不够,您可以随时使用 Express、happy、Restify、Loopback 或其他一些框架或普通http甚至net模块编写一个非常简单的服务器(取决于您需要多少控制 - 例如,您应该始终测试未正确使用 HTTP 协议或断开的连接的无效响应, 连接不完整,连接速度慢等,为此您可能需要在 Node 中使用较低的杠杆 API)自己提供模拟数据。

顺便说一下,您还始终需要使用无效的JSON测试响应,因为人们经常错误地认为他们获得的JSON始终有效,而事实并非如此。请参阅此答案以了解为什么它特别重要:

  • 使用 Node 调用 JSON API.js

特别是因为基于具有所有必要功能的快速服务器编写一个好的似乎并不难......它存在吗?

并非所有"不会那么难写"的东西都必须存在。你可能需要写它。嘿,您甚至已经准备好了路线图:

必要功能:

  1. 服务器可以从javascript配置和启动
  2. 响应(包括标头)可以动态配置
  3. 响应也可以即时轻松重置,而无需关闭服务器。

现在你只需要选择一个名称,在GitHub上创建一个存储库,在npm上创建一个项目并开始编码。

你现在,即使"写起来不会那么难",也不意味着它会自己写。欢迎来到开源世界,人们不会抱怨某些东西不存在,而只是写它。

你可以试试nock。 https://github.com/node-nock

它支持您的所有功能请求。

最新更新