2015-08-17 3 views
3

Я пытаюсь выполнить проверку разрешения/отклонения внешних обещаний.Внешние обещания никогда не заканчиваются в модульных тестах с помощью ngMock

Проблема заключается в том, что эти обещания никогда не заканчиваются при вводе ngMock модуля, что является обязательным, поскольку я запускаю HTTP-запросы и таймауты.

Возьмем, к примеру, angular-pouchdb, что является зависимостью моего проекта. Начиная с версии 2.0.0, поскольку PouchDB promises are used, тесты больше не заканчиваются , когда вводится ngMock.

Пример кода, адаптировано из angular-pouchdb tests:

var scope; 
beforeEach(function() { 
    var $injector = angular.injector(['ng', 'ngMock', 'pouchdb']); 
    var pouchDB = $injector.get('pouchDB'); 
    scope = $injector.get('$rootScope'); 
    db = pouchDB('db'); 
}); 

it('should wrap destroy', function(done) { 
    db.destroy() 
    .then(shouldBeOK) 
    .catch(shouldNotBeCalled) 
    .finally(done); 

    // No matter what's used ($apply, $applySync, $timeout.flush, etc) -- the tests will never finish. 
    scope.$apply(); 
}); 

Бревно для приведенного выше теста заключается в следующем:

C:\Users\Gustavo\Projetos\main\angular-pouchdb (master) 
λ karma start 
INFO [karma]: Karma v0.12.37 server started at http://localhost:9876/ 
INFO [launcher]: Starting browser PhantomJS 
INFO [PhantomJS 1.9.8 (Windows 8 0.0.0)]: Connected on socket s1A7jIzmtcOxkGCtzYke with id 42899233 
PhantomJS 1.9.8 (Windows 8 0.0.0) Angular-aware PouchDB public API should wrap destroy FAILED 
     Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 

Итак, мой вопрос сводится к: там что-то я отсутствует при модульном тестировании Угловое? Или это внутренняя ошибка в ngMock?

This issue has been created in the angular-pouchdb repository as well.

ответ

0

Редактировать 8/25: Таким образом, мы действительно решили эту проблему, но я все еще смотрю, что вызвало ее. У меня будет более подробная запись за несколько дней.

После того, как я ударил по этой проблеме в свободное время в течение нескольких дней, я сузил это до какого-либо исключения исключения в стороннем обещании от pouchDB, где он попадает в 10-секундный тайм-аут и не бросает чистая ошибка. Я могу получить это путем обновления моей

jasmine.DEFAULT_TIMEOUT_INTERVAL = 20000; 

Если бы я вернулся через и настроить пользовательские сборки и поставить некоторое протоколирование, чтобы pouchDB я могу подтвердить, что обещание не получает правильно вернулось туда, я был способный копировать это в 3.6 и 4.0 pouchDB. Из моих завернутых консольных журналов вокруг вызова ничего не происходит из завернутого вызова. Вокруг теста 3 я получаю нечеткие ошибки 409, поэтому в pouchDB явно что-то не обрабатывается правильно.

Error Logs

Вот пример без ngMock включен, так что вы можете увидеть, как далеко он получает без него.

Without ngMock

+0

'Ошибка: Нет отложенных заданий, чтобы быть flushed' - кроме того, я могу воспроизвести ту же проблему, используя мокко. – gustavohenke

+0

Возможно, для ваших целей тестирования вам просто нужно проверить, что ничего не нужно называть как $ timeout.verifyNoPendingTasks() – James

+0

Также вы проверяете это в Chrome или PhantomJS, потому что это может иметь значение. – James

-1

Я не думаю, что это ngMock вопрос, но я думаю, что это потому, что PhantomJS не готова поддержать PouchDB еще.

https://github.com/ariya/phantomjs/issues/10992

https://github.com/pouchdb/pouchdb/blob/c55db55d7edbf0821538e027399536c260af5876/docs/adapters.md

+0

[Построение с использованием углового pouchdb v1.0.2 с обратными вызовами] (https://travis-ci.org/Syonet/model/builds/76355181) – gustavohenke

+0

Если вы прочтете комментарий из моего ответа, я уже просил gustavohenke, и он смог воспроизвести проблему как хром. Я подтвердил, что этот вопрос не является специфичным для браузера. – James