javascript - Nock 拦截器链接,第二个模拟被忽略

标签 javascript node.js mocha.js nock

使用 nock 模拟请求链的简单示例。


    const request = require('request-promise');

    module.exports = () => {

      const URL1 = 'https://my.host.com/a/b/c/d';
      const URL2 = 'https://my.host.com/a/b/x/y?k=v';

      const options = {
        method: 'POST',
        uri: URL2,
        body: {
          some: 'payload'
        },
        json: true
      };

      return request(URL1)
        .then(() => request(options))
        .catch(e => console.error(e))
    };


并测试它:


    require('should');
    const nock = require('nock');

    const testFn = require('./');

    describe('Check endpoint requests', () => {

      beforeEach(() => {
        nock.disableNetConnect();
      });

      afterEach(() => {
        nock.cleanAll();
        nock.enableNetConnect();
      });

      it('should hit correct endpoints', () => {
        const scope = nock(`https://my.host.com/a/b`, {
          encodedQueryParams: true,
        })
          .get('/c/d')
          .reply(200)
          .post('/x/y', {
            some: 'payload'
          })
          .query({k: 'v'})
          .reply(200);

        testFn().then(() =>
          scope.isDone().should.be.true()
        );
      });
    });


因此,在测试过程中,第二个“POST”请求模拟被完全忽略。在点击第一个模拟 URL1 之后 - nock 清除该范围的待处理模拟并将其标记为已完成。

最重要的是基本 URL 是相同的。

这是一个错误,还是我使用不当。

最佳答案

您的测试中存在一些小问题。

首先,传递给 nock 的值应该是 origin并且不应包含路径的一部分。相反,在您的情况下,getpost 应该具有完整路径。

其次,您要删除 encodedQueryParams: trueThat flag means拦截器是使用已编码的查询/搜索参数创建的,但是,您可以像 .query({k: 'v'}) 那样调用它,它没有预先编码。

最后一个问题是您没有告诉 Mocha 测试何时完成。因此,它在获得所有结果之前就完成了测试。有两种方法可以实现这一目标。要么在 it 回调中接受一个参数,done 是命名法。或者使回调异步并等待您的请求。我在下面实现了后者。

  it('should hit correct endpoints', async () => {
    const scope = nock('https://my.host.com')
      .get('/a/b/c/d')
      .reply(200)
      .post('/a/b/x/y', {
        some: 'payload'
      })
      .query({k: 'v'})
      .reply(200);

    await testFn();
    scope.isDone().should.be.true();
  });

关于javascript - Nock 拦截器链接,第二个模拟被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59648306/

相关文章:

node.js - 如何测试 node.js websocket 服务器?

javascript - 使用 AJAX 时解决与 jQuery live() 的冲突

javascript - 根据循环的选择框选择动态显示和隐藏字段

javascript - 断言错误: Target cannot be null or undefined

Javascript 单元测试全栈

Node.js Azure 文件服务 - 403 错误调试

javascript - Cypress:页面未在单击操作的第二个 'it' block 内加载

javascript - 粘列垂直滚动

javascript - 找不到模块 : Error: Can't resolve 'avoriaz'

node.js - v8 引擎 - 为什么从 JS 调用 native 代码如此昂贵?