如何解决在茉莉花单元测试$ q.all的承诺?(How to resolve $q.all prom

2019-09-01 14:37发布

我的控制器具有类似下面的代码:

$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];
});

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

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;
});

现在,在我的测试我检查,如果服务被称为与数据1,数据2不是不确定的..

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();
});

我的问题是,这是工作的罚款,直到我取代与q.all控制器和测试我的个人服务呼叫scope.$applyrootScope.$digest 。 随着q.all和rootScope.$digest (尝试使用scope.$apply为好)这两个测试失败,错误:

10 $摘要()迭代达到。 中止!

如果我删除rootScope.$digest则承诺永远不会得到解析和测试失败说

预期未定义被定义。

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

碰上了这个职位

但是,这也于事无补,因为我已经尝试使用$digest

Answer 1:

你可以尝试把$rootScope.$apply()afterEach()回调函数。 承诺解决上$apply()的角度。

afterEach(function(){
    rootScope.$apply();
});


文章来源: How to resolve $q.all promises in Jasmine unit tests?