Перехватчики цепей Nock, второй макет игнорируется - PullRequest
0 голосов
/ 08 января 2020

Простой пример насмешливой цепочки запросов с 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-адрес basi c одинаков.

Это ошибка или я ее неправильно использую.

1 Ответ

1 голос
/ 08 января 2020

У вас есть несколько незначительных проблем в вашем тесте.

Во-первых, значение, переданное nock, должно быть просто origin и не должно включать часть пути. Вместо этого, в вашем случае, get и post должны иметь полный путь.

Во-вторых, вы хотите удалить encodedQueryParams: true. Этот флаг означает, что перехватчик создается с использованием уже закодированных параметров запроса / поиска, однако вы называете его как .query({k: 'v'}), который предварительно не закодирован.

Последняя проблема что ты не говорил Мокко, когда тест закончился. Таким образом, он заканчивал тестирование до того, как получил все его результаты. Есть два способа добиться этого. Либо примите аргумент в обратном вызове it, done - это номенклатура. Или сделайте обратный вызов asyn c и ждите ваших запросов. Я реализовал последнее ниже.

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