제 3 자 약속 (PouchDB에서 반환 한 약속) 을 Angular promises로 변환하려면 $q.when
을 사용하고 있습니다.
을 감안할 때 :
'use strict';
angular.module('test', [])
.service('pouchdb', function($q, $window) {
var db = new $window.PouchDB('test');
this.info = function() {
return $q.when(db.info.apply(db, arguments));
};
})
.controller('test', function($scope, pouchdb) {
pouchdb.info()
.then(function(info) {
$scope.result = info;
})
.catch(function(error) {
$scope.result = error;
});
});
을 ... 브라우저에서, info
가 반환되고 $scope
올바르게 업데이트되었습니다. 그러나 는 다음 단위 테스트 (재스민 2.x에서) 주어진 :
describe('Q when tests', function() {
beforeEach(module('test'));
var $rootScope, pouchdb;
beforeEach(inject(function(_$rootScope_, pouchdb) {
$rootScope = _$rootScope_;
pouchdb = pouchdb;
}));
it('should resolve a promise', function(done) {
pouchdb.info()
.then(function(info) {
expect(info).toBeDefined();
})
.finally(done);
$rootScope.$apply();
});
});
이 (& PhantomJS을 카르마를 통해)
... info
가 해결되지 않습니다 재스민 던졌습니다 :
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
$rootScope.$apply()
를 호출하면, 내가 ' 다이제스트가 시작되고 약속이 해결되기를 기대합니다. 이 경우 약속을 어떻게 해결합니까?
참고로 PhantomJS에서 bind
/apply
에 대해 es5-shim
을로드했습니다.
편집 : 나는 $rootScope.$digest()
에 교류와 재스민의 제한 시간 (jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
)를 증가 테스트 (과 afterEach
블록)의 상단에 $rootScope.$apply()
이동 시도했습니다.
어쩌면 당신은 $ rootScope을 시도 할 수 있습니다 $ 다이제스트();. $ apply() 또는 pouchdb.info()를 호출하는 대신 resolve(); 아니면 둘다. 또 다른 가능성은 http 요청이 너무 오래 걸리고 더 높은 시간 제한을 설정할 수 있다는 것입니다. jasmine (spyOn)의 mock을 볼 수도 있습니다. 단, 웹 서비스를 테스트하려는 경우는 예외입니다. –
move $ rootScope. $ apply(); 테스트의 맨 위로 다이제스트 루프는 해결되지 않은 모든 약속을 해결합니다. 실행 한 후에는 해결 된 값에 액세스 할 수 있습니다. – bengro
@BorisCharpentier, @bengro, 귀하의 제안을 사용하지 않으려 고 시도했습니다 (편집 참조). 'pouchdb.info()'는'.resolve' 속성을 포함하지 않습니다 ('$ q' 약속입니다). 'pouchdb.info'에 대한 감시는'info()'가 올바르게 호출되었지만'pouchdb.info(). then'에는 올바르게 호출되지 않았 음을 보여줍니다. – tlvince