2017-02-07 4 views
1

У меня есть этот простой код средний слой, который будет вызван кем-то, и он звонит какой-то другой API, который возвращается Promiseтест Запись для JavaScript Promise

function getSomething() { 
    return api.fetchSomething() 
    .then(response => response) 
} 

Чтобы проверить это, я написал этот тест, проходящий ,

it('should make a call to api method ',() => { 
     const someResponse = {}; 
     const fetchSomethingStub = sandbox.stub(api, 'fetchSomething').returns(Promise.resolve(someResponse)); 
     const someResult = getSomething(); 

     someResult.then((result) => { 
      expect(fetchSomethingStub).to.have.callCount(1); 
      expect(result).to.eventually.equal(someResponse); 
     }); 
    }); 

Но так как мой api.fetchSomething() может вернуться слишком отклонять я изменил окурок вернуть Promise.reject но тест проходит, но с сообщением (node:14688) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): [object Object]. Это значит, что у меня должен быть блок catch в этом слое.? Я планирую просто передать значение из api. Также я делаю тест правильно для обещания. Любое предложение с ресурсом для поиска теста Promise с мокко оценивается.

+0

Часть '.then (response => response)' бессмысленна. Опустите. – Bergi

+0

@ Bergi - это также означает, что и разрешение, и отклонение будут переданы обратно ему, и он устраняет способ, необходимый для тестирования? –

+0

Да, и исполнение, и отказ будут переданы напрямую. Если вы уже тестируете 'api.fetchSomething()', то тестирование 'getSomething()' может быть бесполезным (хотя утверждение, что они делают то же самое, может быть хорошо) – Bergi

ответ

0

Итак, у вас есть необработанное исключение в этом коде. Если вы действительно хотите проверить поведение в случае отклонения, тогда да, вам понадобится тест с обработчиком .catch. Если обещание отклонено, обработчик .then никогда не вызывается, поэтому ваших утверждений не произойдет.

Другая вещь, которую вы можете сделать, это изменить эту строку:

someResult.then((result) => { 

к

return someResult.then((result) => { 

Это возвращает обещание обратно к бегуна Мокко и позволяет правильно его обнаружить не удалось тест, где обещание было отвергнуто неожиданно.

Без этого у вас также есть ошибка синхронизации в вашем тесте - Mocha не знает дождаться завершения работы async до сообщения результатов. Возврат обещания правильно вставляет в тестовый бегун & отчет о результатах.

+0

Технически я считаю, что вы можете справиться с ошибкой с помощью функция в thenable: .then ((res) => {}, (rej) => {}), но это обескураживается по нескольким причинам. Поймать определенно, как вы хотите справиться с этим; согласовано. – thesublimeobject

+0

@thesublimeobject Нет, это не обескуражено, посмотрите на [разницу между '.then (...) .catch (...)' и '.then (..., ...)'] (http://stackoverflow.com/q/24662289/1048572). Если ваш тест хочет отличить выполнение от отказа, вы должны использовать 'then' с двумя обратными вызовами. – Bergi