2016-08-26 3 views
4

Я пишу приложение с угловым 2 RC5 и модульное тестирование с использованием Karma и Jasmine.Как проверить метод, возвращающий Promise

У меня есть метод, который возвращает Promise<Foo> (Это на вершине вызова углового-х http.post) Я хочу, чтобы запустить некоторые утверждения после этого заканчивается.

Что-то вроде этого не работает

let result = myService.getFoo(); 
result.then(rslt => expect(1+1).toBe(3)); // the error is lost 

Это создает «Неизвестное Promise отказ» предупреждение, но ошибка подавляется и тест пройден. Как я могу запускать утверждения на основе моих разрешенных обещаний?

Примечания:

  • Метод .catch() не кажется, что я после. Я не хочу регистрировать или делать что-либо, что продолжает нормальный поток программы, я хочу пропустить тест.
  • Я видел код, который выглядит как $rootScope.$digest();. Я не уверен, что такое машинописный эквивалент такого рода вещей. Кажется, не существует способа сказать: «У меня есть обещание, я буду ждать здесь, пока у меня не будет синхронного результата».
+0

У вас есть babel (в частности, babel-polyfill) в вашей сборке? Вы должны иметь возможность использовать async/wait, чтобы ждать выполнения обещания. – Nik

+0

Обратите внимание, что Jasmine допускает синхронные спецификации с 'jasmine.clock' (альтернативой« $ rootScope »A1. $ Digest()'). – estus

ответ

3

Испытание должно выглядеть примерно так:

it('should getFoo', function (done) { 
    let result = myService.getFoo(); 
    result 
    .then(rslt => expect(rslt).toBe('foo')) 
    .then(done); 
}); 
+0

Да, спасибо. Мне не хватало 'then (done);' (для параметра 'DoneFn'). Это означало, что мои утверждения взорвались после того, как спецификация закончилась. –

1

Использование done обратного вызова работает, но вы должны быть в состоянии сделать это, а также:

(Обратите внимание на return)

it('should getFoo', function() { 
    let result = myService.getFoo(); 
    return result 
    .then(rslt => expect(rslt).toBe('foo')) 
}); 
Смежные вопросы