Я строю модуль узла и стараюсь изо всех сил пытаться выполнить тестирование. Я установил mocha и chai для обработки теста. У меня возникла проблема с тестированием моих асинхронных методов (методов, возвращающих обещания).Assert Is Breaking Async Function in Mocha Test
В следующем тесте я тестирую метод объекта «Обновление».
it('Should return a list of versions for the default git repo', function (done) {
fs.writeFileSync(appSetup.CONFIG_FILENAME, JSON.stringify(appSetup.DEFAULT_CONFIG));
var upgrade = new Upgrade({
quiet: true
});
upgrade.getVersions().then(function (versions) {
assert(versions && versions.length > 0, 'Should have at least one version.');
assert.equal(1, 2); // this throws the exception which causes the test case not even exist
done();
}, done);
});
getVersions()
вызов возвращает обещание как метод асинхронной. Когда обещание решает, я хочу проверить значение, возвращаемое в переменной versions
.
assert(versions && versions.length > 0, 'Should have at least one version.');
- это фактическое испытание. Я добавил assert.equal(1, 2);
, потому что заметил, что когда тест должен завершиться неудачно, тестовый пример даже не появится в тестовом списке.
Я предполагаю, что вызов assert бросает исключение, которое Mocha должно забрать. Однако он попадает в ловушку в обетованиях функции then
.
Что здесь происходит? Почему, когда утверждение будет терпеть неудачу в этом методе, не отображает ли тестовый пример в списке (он не отображается как сбой, как будто он не существует)?
Я не уверен, что понимаю, почему этот ответ работает. Исходный код в основном: async(). Then (function() { throw new Error(); // если эта строка выбрасывается, то это переходит к обработчику .catch() done(); }) ,catch (done) // register done() как обработчик ошибок. Если бросок происходит, вызов 'done()' в обработчике 'then()' не выполняется, но вместо этого вызывается обработчик '.catch()' ... который все еще 'done'. –
Упс, комментарии не позволяют блокировать блоки и блокируются через 5 минут. Извините за форматирование дерьма :( –
'.then (fn, done)' не эквивалентен '.then (fn) .catch (done);', это ядро разницы. В первом случае, если 'fn' throws , это необработанная ошибка, во втором примере вызывается 'done'. – loganfsmyth