4

尝试测试一个基于 Promise 的服务,它执行以下操作:

load : function(){
        var deferred = $q.defer();

        //Do misc async stuff
        deferred.resolve();

        return deferred.promise;
    }

当尝试在 Karma + Jasmine 2.0 中对此进行测试时,我尝试使用它的 done() 回调,但它总是超时并且永远不会解决承诺。

beforeEach(inject(function ($injector) {
    service = $injector.get('myService');
    $window = $injector.get("$window");
    $rootScope = $injector.get('$rootScope');
}));

describe('Call load', function () {
    it('resolves its promise', function (done) {
      service.load().then(function(){
          expect(something).not.toBe(undefined);
          done();
      });
    });
});

从 Jasmines 文档来看,这就是我应该如何使用 done() 和异步代码,但似乎问题是承诺永远不会解决

4

1 回答 1

0

正如评论中提到的@TimCastelijns,您需要调用$scope.$apply以解决单元测试中的承诺:

load: function(){
    var deferred = $q.defer();

    setTimeout(function () {
        //Do misc async stuff
        deferred.resolve();
        $rootScope.$apply();
    });

    return deferred.promise;
}
于 2016-10-12T17:28:33.270 回答