Я поразил странную вещь, пытаясь проверить сервис, возвращающий обычные обещания $ q. Никакое обещание, которое я пытаюсь в любом тесте, на самом деле никогда не разрешалось/отклонялось (более конкретно обработчики с этого then
не вызываются, код внутри обещаний работает просто отлично). Я даже пытался заставить дайджест на корневой области, как некоторые другие ответы на SO предложил, без всякой удачи.
Вот небольшой самодостаточный пример:
describe('promise', function(){
jasmine.DEFAULT_TIMEOUT_INTERVAL = 500;
let q;
beforeEach(inject(function($q){
q = $q;
}));
it('finishes', function(done){
expect(q).toBeDefined();
const promise = q.resolve();
console.log(promise);
promise.then(
() => done(),
() => done.fail()
);
});
});
Что мне нужно сделать, чтобы обещать работу, как ожидалось?
Вам нужно использовать $ scope. $ Apply() (или $ rootScope. $ Digest()) и определить then() перед вызовом. Я изменил ваш пример:
describe('promise', function(){
jasmine.DEFAULT_TIMEOUT_INTERVAL = 500;
let q;
let scope;
beforeEach(inject(function($q, $rootScope){
q = $q;
scope = $rootScope.$new();
}));
it('finishes', function(done){
expect(q).toBeDefined();
const promise = q.resolve();
promise.then(
() => done(),
() => done.fail()
);
scope.$apply();
});
});
Надеюсь, что этот пример поможет вам в использовании $ rootScope. $ Digest() (я знаю, что вы уже пробовали форсировать дайджест уже). Просто игнорируйте объявления типов (было написано с использованием машинописного текста)
var service: IService;
var $rootScope: ng.IRootScopeService;
var $q: ng.IQService;
beforeEach(() => {
angular.mock.module("app");
angular.mock.inject((
_$rootScope_: ng.IRootScopeService,
_$q_: ng.IQService
) => {
// Assign dependecies
$q = _$q_;
$rootScope = _$rootScope_;
});
// Initialize service
service = new Service($q);
});
it("should call errorCallback", () => {
let callback = {
errorCallback: function (response: any) { /*empty function */ }
};
spyOn(callback, "errorCallback");
service.connect(null)
.catch(callback.errorCallback);
// Trigger a digest on rootScope (needed for $q implementation)
$rootScope.$digest();
expect(callback.errorCallback).toHaveBeenCalled();
});
done
. Просто$rootScope.$digest()
после создания цепочки обещаний. Любой более новый,then
s, потребует запуска другого дайджеста.