【问题标题】:Testing Angular $q qith Jasmine 2 and karma使用 Jasmine 2 和 karma 测试 Angular $q
【发布时间】:2014-04-28 13:35:36
【问题描述】:

尝试测试一个基于 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() 和异步代码,但问题似乎是承诺永远不会解决

【问题讨论】:

  • $scope.$apply() 应该解决承诺
  • 感谢@TimCastelijns。你应该这样回答。
  • 谢谢@TimCastlijns,我同意其他人的观点,你应该用解释来回答。单元测试中未解决的 Promise 问题让我困惑了很长时间。
  • 添加了一个答案,因为我几乎忽略了这个问题,因为它没有答案并且已经两年多了。

标签: angularjs jasmine karma-runner karma-jasmine


【解决方案1】:

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

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

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

    return deferred.promise;
}

【讨论】:

  • 我真的不明白为什么你需要打电话给$scope.$apply() 来解决一个承诺。如果我不使用$scope 怎么办?如果我返回一个已存在的承诺,例如$http.get(),该怎么办?
猜你喜欢
  • 1970-01-01
  • 2017-05-01
  • 2015-12-07
  • 1970-01-01
  • 2017-08-02
  • 2018-01-31
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多