Node.js Nock 模拟请求超时和后续成功

Posted

技术标签:

【中文标题】Node.js Nock 模拟请求超时和后续成功【英文标题】:Node.js Nock simulate request timeout and subsequent success 【发布时间】:2015-10-11 10:06:14 【问题描述】:

我正在尝试模拟服务请求超时以测试节点 requestretry 模块,该模块允许您指定请求的最大尝试重试次数和重试延迟。为了测试这一点,我需要使用 nock 模拟前 X 个请求的超时,然后成功响应相同的请求。我知道有 'socketDelay()' 方法可以延迟连接,但是在第一次延迟响应之后如何指定成功响应?

我有这个,它模拟第一个请求的超时

//delays the first request's response by 1500
nock(urlHost)
     .post('/' + uriPath)
     .socketDelay(1500)
     .reply(200, 'response body');

但是我怎样才能让它响应更快,以模拟服务恢复?我想按照这些思路做点什么

//delays the first two request's responses by 1500
nock(urlHost)
    .post('/' + requestIdentifier.ttoRoutingInfo.uriPath)
    .socketDelay(1500)
    .reply(200, 'response body')
    .times(2)
  //delays the third request by only 300
    .then
    .socketDelay(300)
    .reply(200, 'response body');

【问题讨论】:

【参考方案1】:

我会回答我自己的问题,因为我想通了。事实证明,nock 允许为同一端点排队模拟,尽管它不在文档中的任何地方。这是我用来模拟请求中不同延迟时间的方法。注意每个回复正文的不同值

 var nockScope = nock(urlHost)
        .post('/' + uriPath)
        .delayConnection(400)
        .reply(200, 'response body1')
        .post('/' + uriPath)
        .delayConnection(400)
        .reply(200, 'response body2')
        .post('/' + uriPath)
        .delayConnection(200)
        .reply(200, 'response body3');


 expect(data).to.equal('response body3');

使用requestretry 模块并设置 timeout=300、retryDelay=500 和 maxAttempts=2 后,响应应该是自前两次超时后的第三次请求的主体。请注意,我为每个响应主体使用了不同的值,以确保我实际上在前两个响应中超时。您可以验证前两个请求是否失败,因为测试需要 1800 毫秒才能完成。 300ms(第一次超时)+ 500ms(延迟)+ 300ms(第二次超时)+ 500ms(延迟)+ 200ms(成功请求)

【讨论】:

我一直在尝试使用更新的代码,但似乎这不再起作用了。我使用的最后一个版本是 11.7.2,但是 11.8.0+ 以某种方式破坏了它。在最近的版本中这仍然适用于您吗?

以上是关于Node.js Nock 模拟请求超时和后续成功的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node.js 和 mongodb 处理超时

使用 Detox 和 Nock 模拟 API 调用

使用 db.query 方法 node.js 时出现 Heroku H12“请求超时”错误

nock 没有拦截我的请求

React API 测试与 Nock 失败并出现“错误:Nock:请求不匹配”

node.js 贝宝 https 请求