Javascript AngularJS:如何测试回调函数中解析的承诺
我已经编写了一个函数,可以打开indexedDB。我使用承诺,因为我认为这是最干净的处理方式Javascript AngularJS:如何测试回调函数中解析的承诺,javascript,angularjs,jasmine,angular-promise,Javascript,Angularjs,Jasmine,Angular Promise,我已经编写了一个函数,可以打开indexedDB。我使用承诺,因为我认为这是最干净的处理方式 this.$get = function($q, $rootScope, $window) { return { finalize: function() { var deferred = $q.defer(); var dbRequest = $window.indexedDB.open(dbName, dbVersion); d
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;
}
};
};
为了测试这一点,我创建了以下测试函数:
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();
});
});
这将打印“成功!”控制台中的代码>,但承诺永远无法解决
如果我将$rootScope.$apply()
移动到onsuccess函数的末尾,承诺将得到解决,但只针对一个测试。其他测试然后抛出一个错误错误:[$rootScope:inprog]$digest已在进行中
我应该如何解决这个承诺?回调函数更好吗
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();所有测试都有一次我尝试了此解决方案,但仍然失败,并显示了我提供的错误消息。我注意到它在与$httpBackend.flush()组合时失败代码>