Немедленно отключите одну область nock, чтобы заново настроить макет URL - PullRequest
1 голос
/ 14 января 2020

Используя nock , есть ли способ отключить одну область действия nock? Я боролся с некоторыми тестами, которые настраивали ноды того же URL, что и некоторые другие тесты. Они оба работают нормально по отдельности, но при запуске в одном сеансе mocha один из них завершается сбоем, потому что я не могу переназначить активные области nock, что означает, что настроенные nocks отлавливают все запросы.

То, что я пробовал:

  • Если я установлю несколько ноток в before() и затем вызову scope.persist(false) в моем after(), он только «отменяет отображение» области видимости, так что он активен для еще одного запроса. Это не сразу отключить его.
  • Я обнаружил, что nock.cleanAll() немедленно отключает узлы, чтобы их можно было установить заново, но затем также отключает любые глобальные узлы, которые могли быть установлены один раз, общие для всех тестовых случаев.

Пока что единственные решения, которые я нашел, это 1) использовать уникальные URL: s для всех nocks, что не всегда возможно, или 2) использовать nock.cleanAll ( ) и не полагайтесь на какие-либо глобальные узлы - вместо этого убедитесь, что настраиваете узлы только в локальных before() функциях, включая многократную установку глобальных для каждого теста, который в них нуждается.

Кажется, это будет быть очень полезным, чтобы иметь возможность делать

scope = nock('http://somewhere.com').persist().get('/'.reply(200, 'foo');

, а затем использовать этот нок в куче тестов и, наконец, сделать

scope.remove();

Однако я не смог сделать что-то подобное. Возможно ли это?

Пример:

before(async () => {
   nock('http://common').persist().get('/').reply(200, 'common');
});

after(async () => {
});

describe('Foo tests', () => {
    let scope;
    before(async () => {
        scope = nock('http://mocked').persist().get('/').reply(200, 'foo');
    });
    after(() => {
        // scope.persist(false); // This causes the Bar tests to use the Foo nocks one more time :(
        // nock.cleanAll(); // This also disables the common nocks
    });
    it('Should get FOO', async () => {
        expect(await fetch('http://mocked').then(res => res.text())).to.equal('foo');
        expect(await fetch('http://common').then(res => res.text())).to.equal('common');
    });
    it('Should get FOO again', async () => {
        expect(await fetch('http://mocked').then(res => res.text())).to.equal('foo');
        expect(await fetch('http://common').then(res => res.text())).to.equal('common');
    });
});

describe('Bar tests', () => {
    let scope;
    before(async () => {
        scope = nock('http://mocked').persist().get('/').reply(200, 'bar');
    });
    after(() => {
        // scope.persist(false);
        // nock.cleanAll();
    });
    it('Should get BAR', async () => {
        expect(await fetch('http://mocked').then(res => res.text())).to.equal('bar');
        expect(await fetch('http://common').then(res => res.text())).to.equal('common');
    });
    it('Should get BAR again', async () => {
        expect(await fetch('http://mocked').then(res => res.text())).to.equal('bar');
        expect(await fetch('http://common').then(res => res.text())).to.equal('common');
    });
});

Эти тесты либо не пройдут 3-й тест при использовании scope.persist(false) (так как этот тест все еще получает версию foo), либо не пройдут тесты 3 и 4 при использовании nock.cleanAll(), поскольку общие узлы удаляются.

1 Ответ

0 голосов
/ 24 апреля 2020

У меня также была эта проблема, и я нашел способ обойти ее, прослушивая событие request, испускаемое областью, и удаляя перехватчик при его запуске. В идеале, я думаю, что вы должны слушать событие replied, но по какой-то причине это событие не срабатывало, когда я его попробовал, не знаю почему. Но код ниже работал для меня:

/**
 * @jest-environment node
 */

const nock = require('nock');

describe('Test suite', () => {

  test('Test case', async () => {

    let interceptor1 = nock('https://example-url.com', {
        reqHeaders: {
          'Content-Type': 'text/xml',
          soapaction: 'http://www.sample.com/servie/getOrders',
        },
      })
      .post('/');

    let interceptor2 = nock('https://example-url.com', {
        reqHeaders: {
          soapaction: 'http://www.sample.com/servie/getProducts',
        },
      })
      .post('/');

    let scope = interceptor1.replyWithFile(200, path.join(__dirname, './path1.xml'));
    interceptor2.replyWithFile(200, path.join(__dirname, './path.xml'));

    scope.on('request', (req, interceptor) => {
      nock.removeInterceptor(interceptor1);
    });

    const resp = await asynccall();
    expect(resp).toStrictEqual(exp);
  });

});
...