Как повторно протестировать тот же URL, используя Mocha и Nock?
Использую мокко, чай, синон, проксиквайр и нок.
Для этого конкретного сценария тестирования (для которого задается этот вопрос), необходимо протестировать один и тот же URL-адрес несколько раз, каждый в отдельном тесте, который ожидает другой ответ.
Например, ответ без торговых каналов, 1 торговый канал и еще раз с 2 торговыми каналами.
Существующий код все работает, более того, если я запускаю тесты по отдельности, они проходят.
Однако, если я запускаю их вместе, используя Mocha в одном наборе, они терпят неудачу. Полагаю, проблема заключается в том, что Nock захватывает глобальный http-объект для заданного URL-адреса, и каждый тест (выполняющийся асинхронно одновременно) конкурирует за одну и ту же глобальную ссылку ответа.
В приведенном выше сценарии ответ, подготовленный с использованием стандартного ответа 1 торговца, перезаписывается настройкой для ответа с 2 торговцами и т. Д.
Существует ли механизм, позволяющий избежать этого, например, гарантии, связанные с последовательным выполнением асинхронных тестов Mocha (что, по моему мнению, было поведением по умолчанию).
2 ответа
Итак, это работает (пример кода):
beforeEach(function (done) {
nock(apiUrl)
.get('/dfm/api/v1/feeds?all=false')
.reply(200, [
{'merchantId': 2, 'id': 2, 'disabled': false}
], { server: 'Apache-Coyote/1.1',
'set-cookie': [ 'JSESSIONID=513B77F04A3A3FCA7B0AE1E99B57F237; Path=/dfm/; HttpOnly' ],
'content-type': 'application/json;charset=UTF-8',
'transfer-encoding': 'chunked',
date: 'Thu, 03 Jul 2014 08:46:53 GMT' });
batchProcess = proxyquire('./batchProcess', {
'./errorHandler': errorHandler.stub,
'./batchTask': batchTask.stub
});
winston.info('single valid feed beforeEach completed');
done();
});
Было много осложняющих факторов. Две вещи, о которых нужно знать:
1). У меня были асинхронные тестовые сценарии, но я использовал beforeEach() без параметра done. Это тогда вызывало конфликты URL. Если явно объявить каждый beforeEach (выполнено) и вызвать done(), Mocha будет работать в последовательном порядке, и проблемы больше не будет.
2). Убедитесь, что если у вас есть несколько тестов в одном и том же файле testsuite, то все приборы Nock, которые вы установили в предыдущем тесте, действительно выполняются, если вы объявили тот же URL в следующем тесте с альтернативным ответом. Если предыдущий прибор nock не вызывается, то nock STILL сохраняет ответ от неправильного теста (предыдущего). Это была моя основная проблема. Вы можете утверждать, что тесты не должны иметь каких-либо объявленных приборов, если они не запускаются, но вы также можете утверждать, что это все еще ошибка в работе Nock. Каждый из тестовых приборов был изолирован в своих собственных функциях description / beforeEach(done).
Обновление через 2 дня... ОК, пункт 2). просто укусил меня снова, и я был рад, что написал записку выше, чтобы напомнить себе об этой трудной для отладки проблеме. Если вы используете Mocha и Nock вместе, знайте об этой проблеме!
В конце концов реализовал также вспомогательную функцию nock, чтобы помочь с этим (coffeescript здесь):
global.resetNock = ->
global.nock.cleanAll()
global.nock.disableNetConnect()
Тогда в начале beforeEach просто примените resetNock()
В ответ на ваш пункт 2), вы можете использовать nock.cleanAll()
очистить все подготовленные насадки:
Вы можете положить это в afterEach
блок, чтобы убедиться, что у вас нет остатков между тестами.
afterEach ->
nock.cleanAll()