如何解决Jasmine单元测试中的$ q.all承诺?

Rah*_* R. 31 unit-testing jasmine jasmine-jquery angularjs karma-runner

我的控制器有如下代码:

$q.all([qService.getData($scope.id), dService.getData(), qTService.get()])
.then(function (allData) {
  $scope.data1 = allData[0];
  $scope.data2 = allData[1];
  $scope.data3 = allData[2];
});
Run Code Online (Sandbox Code Playgroud)

在我的单元测试中,我正在做这样的事情:

beforeEach(inject(function($rootScope, $q, $location){// and other dependencies... 
  qServiceSpy = spyOn(_qService, 'getData').andCallFake(function () {
    var data1 = {
      id: 1,
      sellingProperty: 1,
    };
    var d = $q.defer();
    d.resolve(data1);
    return d.promise;
  });

  dServiceSpy = spyOn(_dService, 'getData').andCallFake(function () {
    var data2 = [{ "id": "1", "anotherProp": 123 }];
    var d = $q.defer();
    d.resolve(data2);
    return d.promise;
  });
  qTServiceSpy = spyOn(_qTService, 'get').andCallFake(function () {
    var data3 = [{ id: 0, name: 'Rahul' }];
    var d = $q.defer();
    d.resolve(data3);
    return d.promise;
  });
  rootScope = $rootScope;
});
Run Code Online (Sandbox Code Playgroud)

现在,在我的测试中,我正在检查是否调用了服务,并且data1,data2未定义.

it('check if qService' got called, function() {
  expect(scope.data1).toBeUndefined();
  rootScope.$digest();
  expect(_quoteService.getQuote).toHaveBeenCalled();
});
it('check if "data1" is defined', function () {
  expect(scope.data1).toBeUndefined();
  rootScope.$digest();
  expect(scope.data1).toBeDefined();
});
Run Code Online (Sandbox Code Playgroud)

我的问题是,这工作正常,直到我用q.all替换我在控制器中的各个服务调用并在测试scope.$applyrootScope.$digest.使用q.all和rootScope.$digest(尝试使用scope.$apply)两个测试都失败并出现错误:

达到10 $ digest()次迭代.中止!

如果我删除rootScope.$digest然后承诺永远不会得到解决,测试失败说

预期未定义的定义.

任何帮助我应该如何单独测试代码q.all

发现这篇文章

但这也没有帮助,因为我已经尝试使用$digest.

Tho*_*ltz 62

您可以尝试$rootScope.$apply()使用afterEach()回调函数.承诺$apply()在Angular中得到解决.

afterEach(function(){
    rootScope.$apply();
});
Run Code Online (Sandbox Code Playgroud)

  • `$ apply`通常会收到回调.我更喜欢`scope.$ digest()`,它只消化当前范围,因此具有更好的性能. (14认同)
  • 如果你想知道记录在哪里:[Kris Kowal的Q和$ q之间的差异](http://docs.angularjs.org/api/ng/service/$q#differences-between-kris-kowal-sq-and- q)&[测试](http://docs.angularjs.org/api/ng/service/$q#testing) (3认同)