2016-01-29 2 views
3

У меня есть некоторый код, который выглядит следующим образом:Promise поймать не поймал в тесте

function foo(){ 
    bar().catch(function(){ 
    //do stuff 
    } 
} 

function bar(){ 
    return promiseReturner().then(
    function(result){ 
     if(_.isEmpty(result)){ 
     throw "Result is empty"; 
     } 
    } 
) 
} 

Я пытаюсь проверить, что //do stuff блок вызывается, когда result пуст:

deferred.resolve(null); 
foo(); 
$rootScope.$apply(); 

сейчас это фактически вызывает блок throw, но по какой-то причине throw блок не попадает на функцию catch. Более интересно то, что, когда этот же код работает за пределами тестовой среды, он ведет себя так, как ожидалось.

Почему я не могу запустить блок catch в своем тестовом коде?

+1

Какое обещание реализации вы используете? Как именно вы подтверждаете, работает ли 'do stuff' или нет? Почему «foo» не возвращает обещание, и где тест ждет его? – Bergi

+0

@Bergi Я использую Angular '$ q'. В блоке 'do stuff' есть поведение, для которого я могу проверить, поэтому могу сказать, запущен ли он. Функция 'foo' не возвращает обещание, потому что это означает, что он является терминальным кодовым блоком для обещаний, поэтому после него больше не нужно. Тест предполагает, что после '$ apply()' все запустилось, и ожидания могут начаться. –

ответ

0

Это не ясно, какой вид реализации обещания вы используете, и контекст, но, возможно, вы можете просто попытаться добавить оператор возврата к функции Foo

function foo(){ 
    return bar().catch(function(){ 
    //do stuff 
    } 
} 
Смежные вопросы