У меня была небольшая проблема, которая беспокоит меня. В следующем коде показан асинхронный тест, в этом тесте мы тестируем код, который мы не имеют контроля (черный ящик для теста, я могу его изменить).Mocha, должен - при тестировании функции async, которая имеет в ней обещание, ошибки утверждения молчат
Код blackbox отправляет событие, когда это будет сделано, тест прослушивает это событие и утверждает данные.
проблема возникает, когда есть ошибка утверждения, исключение вызывается и обрабатывается обработчиком ошибок обещания, а не тестовой средой, поэтому выполняемая функция никогда не выполняется, и мы получаем ошибку тайм-аута для этого теста.
его легко решить путем try & уловить внутри него() блок, но это хорошая практика, чтобы ВСЕГДА попробовали & уловить внутри него() блок? до сих пор я доверял тестовой платформе для обработки исключений. Еще одна проблема заключается в том, что ошибка является тихой, если улов не отпечатывает ее, и с ее черного ящика мы не можем на нее рассчитывать.
советов здесь помогли мне решить это, но я не люблю решения: https://github.com/mochajs/mocha/issues/1128#issuecomment-40866763
он отличается от других подобных вопросов, потому что в его() блоке мы не имеют какие-либо ссылки на объект обещания.
describe.only("test", function() {
var event;
// blackbox simulates a code we have no controler over
// inside this code we have a promise, when this promise resolves it triggers event
var blackbox = function() {
var promise = new Promise(function (resolve, reject) {
resolve();
});
promise.then(function() {
event(4);
}).catch(function (e) {
console.log(e);
});
};
it("async with blackbox promise", function (done) {
// this simulates event listenner, when the event is triggered the code executes
event = function (data) {
// this assertion works and everything is fine
data.should.be.equal(4);
// this assertion thrown exception that is being cought by the promise reject handler and
// isnt cought by the testing framework (chai/mocha)
data.should.be.equal(5);
// because the exception is thrown we never reach the done
done();
};
blackbox();
});
});
Я думаю, что вы путаете немного вещей. Всегда возвращайте свои обещания, и при тестировании обещаний вам не нужен обратный вызов 'done'. Просто верните все обещания, которые у вас есть. – MarcoL
Также обратите внимание, что если вы хотите, чтобы 'mocha' терпело неудачу на отклоненном« обещании », вам не нужно« ловить »себя. – MarcoL
@MarcoL, это всего лишь пример, поскольку код blackboxed - я не контролирую его. это может быть сторонняя lib/зависимость или вы имеете в виду код примера Blackbox написан неправильно? –