Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:如何测试回调函数中解析的承诺_Javascript_Angularjs_Jasmine_Angular Promise - Fatal编程技术网

Javascript AngularJS:如何测试回调函数中解析的承诺

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

我已经编写了一个函数,可以打开indexedDB。我使用承诺,因为我认为这是最干净的处理方式

  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()组合时失败