为什么似乎没有任何强大的HTTP服务器模拟程序包用于节点? (或者在那里?)

时间:2017-03-03 01:14:44

标签: node.js testing mocking

我对Node.js很新,所以我可能没有得到它,但在搜索了一下之后,尝试了一些不同的解决方案,我仍然无法找到一个体面的模拟方法使用Node进行验收测试的API响应。

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

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

mock-http-server:看起来还不错,让我调整标题,但是没有关闭整个服务器就无法重置模拟响应......!这有问题,因为服务器在浏览器窗口仍然打开时不会关闭,这意味着我必须关闭并重新启动浏览器才能清除模拟!

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

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

必要的功能:

  1. 可以从javascript配置和启动服务器
  2. 可以动态配置响应(包括标题)
  3. 响应也可以在不关闭服务器的情况下轻松重置。

3 个答案:

答案 0 :(得分:2)

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

就你正在寻找的事情而言,Mockttp:

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

最重要的是,它:

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

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

答案 1 :(得分:1)

  

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

没有。您不必制作实际的HTTP请求来测试您的应用。

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

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

顺便说一句,您还总是需要使用无效的JSON测试响应,因为人们经常错误地认为他们获得的JSON总是有效的,而不是。看到这个答案,看看为什么它特别重要:

  

特别是因为看起来很难根据具有所有必要功能的快速服务器编写一个好的...它是否存在?

并非所有"都不会那么难写#34;必须存在。你可能需要写它。嘿,你甚至准备好了路线图:

  

必要的功能:

     
      
  1. 可以从javascript配置和启动服务器
  2.   
  3. 可以动态配置响应(包括标题)
  4.   
  5. 响应也可以在不关闭服务器的情况下轻松重置。
  6.   

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

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

答案 2 :(得分:0)

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

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