Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Nock拦截器链接,忽略第二个模拟_Javascript_Node.js_Mocha.js_Nock - Fatal编程技术网

Javascript Nock拦截器链接,忽略第二个模拟

Javascript Nock拦截器链接,忽略第二个模拟,javascript,node.js,mocha.js,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: 'PO

使用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是相同的


这是一个bug,还是我用错了

您的测试中有一些小问题

首先,传递给nock的值应该只是路径的一部分,不应该包括路径的一部分。相反,在您的情况下,get和post应该具有完整的路径

其次,要删除encodedQueryParams:true。拦截器是使用已经编码的查询/搜索参数创建的,但是,您可以像.query{k:'v'}一样调用它,它不是预编码的

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

  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();
  });

你的测试中有一些小问题

首先,传递给nock的值应该只是路径的一部分,不应该包括路径的一部分。相反,在您的情况下,get和post应该具有完整的路径

其次,要删除encodedQueryParams:true。拦截器是使用已经编码的查询/搜索参数创建的,但是,您可以像.query{k:'v'}一样调用它,它不是预编码的

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

  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();
  });