Angular $q.если он не разрешен в карме unit test

Я использую $q.when, чтобы обернуть другой lib promises. Он работает как прелесть, но когда я пытаюсь запустить его внутри Karma, обещание не удается разрешить ( done() никогда не выполняется), даже если я запустил $digest и даже после тайм-аут. Вот пример кода:

describe('PouchDB', function () {
var $q, $rootScope;

beforeEach(inject(function (_$rootScope_, _$q_) {
    $rootScope = _$rootScope_;
    $q = _$q_;
}));

it("should run", function (done) {

    function getPromise() {
        var deferred = Q.defer();

        deferred.resolve(1);

        return deferred.promise;
    }

    $q.when(getPromise())
        .then(function () {
            done();   // this never runs
        });

    $rootScope.$digest();
});

Почему? Какова причина этого? Я действительно не могу это получить.

Обновление (обходной путь)

Я не понимаю, почему $q.when не разрешен в Karma - он имеет что-то с функцией nextTick, но я не могу отладить проблему. Вместо этого я бросил $q.when и написал простую функцию, которая преобразует PouchDB (или любой другой, такой как Q) в $q:

.factory('$utils', function ($q, $rootScope) {
  return {
    to$q: function (promise) {
      var deferred = $q.defer();

      promise.then(function (result) {
        deferred.resolve(result);
        $rootScope.$digest();
      });

      promise.catch(function (error) {
        deferred.reject(error);
        $rootScope.$digest();
      });

      return deferred.promise;
    }
  }
})

Ответ 2

Я скорректировал переменные и введенные имена зависимостей на этом, чтобы все было ясно, так как тестовое письмо продолжается. Если done() является функцией внутри вашей (директива?? Service? Service/factory?), Тогда она должна вызываться, когда тест выполняется, не пытаясь передать его в качестве зависимости. В идеале done() следует проверять, но не зная, откуда это происходит, невозможно показать вам, как настроить функцию шпиона.

Единственная другая недостающая деталь: у вас нет ожидаемого() в этом наборе тестов. Без этого я не знаю, что вы ожидаете от себя.

describe('PouchDB', function () {
    var scope, db, q, rootScope;

    beforeEach(
        inject(
            function(_$rootScope_, _$q_){
                rootScope = _$rootScope_;
                scope = rootScope.$new();
                q = _$q_;
            }
        )
    );

    it("should run", function(){

        //spy should be constructed here

        function getPromise() {
            var deferred = q.defer();

            deferred.resolve(1);

            return deferred.promise;
        }

        q.when(getPromise)
            .then(function () {
                done();
            });

        scope.$digest();

        //assertion should be here

    });
});