2014-12-08 3 views
1

나는 indexedDB를 여는 함수를 작성했다. 나는 이것을 처리하는 가장 깨끗한 방법이라고 생각하기 때문에 약속을 사용하고 있습니다.AngularJS : 콜백 함수에서 해결 된 약속을 테스트하는 방법

describe('finalize', function() { 
    it('should initialize the database', function(done) { 
     var promise = resource.finalize(); 
     promise.then(function() { 
     console.log('resolved'); 
     var transaction = resource.db.transaction(['Component']); 
     expect(transaction).toBeDefined(); 
     done(); 
     }); 
     $rootScope.$apply(); 
    }); 
    }); 

이 콘솔에 'Success!'를 인쇄하지만 약속이 해결되지 않습니다이를 테스트하기 위해

this.$get = function($q, $rootScope, $window) { 
    return { 
     finalize: function() { 
     var deferred = $q.defer(); 
     var dbRequest = $window.indexedDB.open(dbName, dbVersion); 
     dbRequest.onupgradeneeded = function(event) { 
      // XXX do something here. 
     }; 
     dbRequest.onsuccess = function(event) { 
      db = event.target.result; 
      console.log('Success!'); 
      deferred.resolve(event); 
     }; 
     dbRequest.onerror = deferred.reject; 
     return deferred.promise; 
     } 
    }; 
    }; 

, 나는 다음과 같은 테스트 함수를 만들었습니다.

$rootScope.$apply()을 onsuccess 함수의 끝 부분으로 이동하면 약속은 해결되지만 하나의 테스트에서만 해결됩니다. 다른 테스트에서는 오류 Error: [$rootScope:inprog] $digest already in progress가 발생합니다.

이 약속은 어떻게 해결해야합니까? 콜백 함수가 더 좋습니까?

답변

2
this.$get = function($q, $rootScope, $window) { 
    return { 
     finalize: function() { 
     var deferred = $q.defer(); 
     var dbRequest = $window.indexedDB.open(dbName, dbVersion); 
     dbRequest.onupgradeneeded = function(event) { 
      // XXX do something here. 
     }; 
     dbRequest.onsuccess = function(event) { 
      db = event.target.result; 
      console.log('Success!'); 
      $rootScope.$apply(function() { 
      deferred.resolve(event); 
      });    
     }; 
     dbRequest.onerror = function (error) { 
      $rootScope.$apply(function() { 
       deferred.reject(error); 
      }); 
     } 
     return deferred.promise; 
     } 
    }; 
    }; 

또한 var promise = resource.finalize();를 사용해야합니다. 한 번만 모든 테스트 수행

+0

이 솔루션을 사용해 보았지만 제공된 오류 메시지와 함께 계속 실패합니다. '$ httpBackend.flush();와 결합 할 때 실패한 것으로 나타났습니다. –