2016-11-15 8 views
0

У меня была небольшая проблема, которая беспокоит меня. В следующем коде показан асинхронный тест, в этом тесте мы тестируем код, который мы не имеют контроля (черный ящик для теста, я могу его изменить).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(); 

    }); 
}); 
+0

Я думаю, что вы путаете немного вещей. Всегда возвращайте свои обещания, и при тестировании обещаний вам не нужен обратный вызов 'done'. Просто верните все обещания, которые у вас есть. – MarcoL

+0

Также обратите внимание, что если вы хотите, чтобы 'mocha' терпело неудачу на отклоненном« обещании », вам не нужно« ловить »себя. – MarcoL

+0

@MarcoL, это всего лишь пример, поскольку код blackboxed - я не контролирую его. это может быть сторонняя lib/зависимость или вы имеете в виду код примера Blackbox написан неправильно? –

ответ

1

Как вы проверить обещания mocha, что вы возвратите их и дайте ему сделать работу решили, когда сбой или нет.

Таким образом, первый шаг, чтобы сделать обещание доступны в вашей blackbox функции:

// 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(); 
    }); 

    return promise.then(function() { 
    event(4); 
    }); 
    // do not catch here unless you want the test to not fail on error 
}; 

Теперь давайте изменим тестовый код для обработки обещаний:

it("async with blackbox promise", function() { 
    // 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 
    data.should.be.equal(5); 
    }; 
    // mocha will append a rejection handler to this promise here and fail if it gets called 
    return blackbox(); 

}); 

 Смежные вопросы

  • Нет связанных вопросов^_^