Ответ 1
Из Как разрешить $q.all promises в модульных тестах Jasmine? кажется, что трюк:
$rootScope.$apply();
У меня была одна и та же проблема, и это работает для меня; promises разрешаются при выполнении этого вызова.
Я использую $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;
}
}
})
Из Как разрешить $q.all promises в модульных тестах Jasmine? кажется, что трюк:
$rootScope.$apply();
У меня была одна и та же проблема, и это работает для меня; promises разрешаются при выполнении этого вызова.
Я скорректировал переменные и введенные имена зависимостей на этом, чтобы все было ясно, так как тестовое письмо продолжается. Если 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
});
});