Используя nock, есть ли способ отключить одну область nock? Я боролся с некоторыми тестами, которые устанавливали ноки того же URL-адреса, что и некоторые другие тесты. Оба они работают нормально по отдельности, но при запуске в одном и том же сеансе mocha один из них дает сбой, потому что я не могу повторно зафиксировать активные области nock, что означает, что настроенные nock перехватывают все запросы.
Что я пробовал:
- Если я настрою несколько ноков в
before()
, а затем вызовуscope.persist(false)
в своемafter()
, это только «отменит сохранение» области, так что она будет активна для еще одного запроса. Это не сразу отключает его. - Я обнаружил, что
nock.cleanAll()
немедленно отключает узлы, чтобы их можно было настроить снова, но затем он также отключает все глобальные узлы, которые могли быть настроены один раз, что является общим для всех тестовых случаев.
До сих пор единственными решениями, которые я нашел, являются: 1) использовать уникальные URL-адреса для всех ноков, что не всегда возможно, или 2) использовать nock.cleanAll() и не полагаться ни на какие глобальные ноки - вместо этого убедитесь, устанавливать ноки только в локальных before()
функциях, в том числе повторно настраивать глобальные для каждого теста, который в них нуждается.
Кажется, было бы очень полезно иметь возможность сделать
scope = nock('http://somewhere.com').persist().get('/'.reply(200, 'foo');
а затем использовать этот nock в куче тестов и, наконец, сделать
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()
, поскольку в этом случае общие стыки удаляются.