2014-10-12 3 views
1

제 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() 이동 시도했습니다.

+1

어쩌면 당신은 $ rootScope을 시도 할 수 있습니다 $ 다이제스트();. $ apply() 또는 pouchdb.info()를 호출하는 대신 resolve(); 아니면 둘다. 또 다른 가능성은 http 요청이 너무 오래 걸리고 더 높은 시간 제한을 설정할 수 있다는 것입니다. jasmine (spyOn)의 mock을 볼 수도 있습니다. 단, 웹 서비스를 테스트하려는 경우는 예외입니다. –

+0

move $ rootScope. $ apply(); 테스트의 맨 위로 다이제스트 루프는 해결되지 않은 모든 약속을 해결합니다. 실행 한 후에는 해결 된 값에 액세스 할 수 있습니다. – bengro

+0

@BorisCharpentier, @bengro, 귀하의 제안을 사용하지 않으려 고 시도했습니다 (편집 참조). 'pouchdb.info()'는'.resolve' 속성을 포함하지 않습니다 ('$ q' 약속입니다). 'pouchdb.info'에 대한 감시는'info()'가 올바르게 호출되었지만'pouchdb.info(). then'에는 올바르게 호출되지 않았 음을 보여줍니다. – tlvince

답변

1

무의식적으로, 나는 수동으로 ng를 주입하여 문제를 해결 :

describe('Working Q when tests', function() { 
    var pouchdb; 
    beforeEach(function() { 
    var $injector = angular.injector(['ng', 'test']); 
    var pouchDB = $injector.get('pouchdb'); 
    pouchdb = pouchDB('db'); 
    }); 

    it('should resolve a promise', function(done) { 
    pouchdb.info() 
     .then(function(info) { 
     expect(info).toBeDefined(); 
     }) 
     .finally(done); 
    }); 
}); 
관련 문제