像 nock 这样的 nodejs 模拟模块有什么好处?

What's benefits of nodejs mock module like nock?

我开发了一个 nodejs 应用程序,它获取 url 并根据 url 中的参数发送响应(json 或 xml)(我必须开发 POST 和 GET/POST 与 SOAP)。 但是我看到一些像 nock 这样的模拟模块,我问自己,与我自己的应用程序相比,这些模块有什么好处?

我的代码示例:

app.get('/uri/to/call/', function(req, res) {
    if(req.query.username=='John'){
        res.json(passedMock);
    }else{
        res.json(failedMock);
    }
})

当您的应用程序在处理入站请求的同时进行出站 HTTP 调用时,网络模拟库(例如 Nock)的好处就会发挥作用。

想象一个看起来像这样的基本应用程序,它在响应之前从第三方收集数据:

app.get('/uri/to/call/', function(req, res) {
    http.get('http://some.third.party.example.com', dataResp => {
      // process data in some way
      resp.json(data)
    }
})

现在您 can/should 编写了许多不同类型的测试来测试此应用,但一类测试将包括您的应用如何响应和处理错误而无需实际调用第三方的 API而您的测试是 运行。

坚持使用 Nock,您可以编写一个测试来确认您的应用通过首先模拟内部请求来处理来自第三方的错误,如下所示:

nock('http://some.third.party.example.com')
  .get('/')
  .replyWithError('oh no!')

然后调用您的应用程序并对响应进行断言。

而且这种类型的测试不仅仅针对错误情况。有很多原因导致在测试期间攻击第三方并不理想。

  • 他们的 API 没有沙盒或限制请求或按请求收费
  • 测试套件的总运行时间
  • 难以让他们的API响应特定值
  • 的Edgecase测试