web-dev-qa-db-fra.com

Comment résoudre toutes les promesses de $ q.all dans les tests unitaires Jasmine?

Mon contrôleur a un code comme ci-dessous:

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

Et dans mes tests unitaires, je fais quelque chose comme ceci:

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

Maintenant, dans mon test, je vérifie si les services sont appelés et les données1, données2 ne sont pas indéfinies.

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

mon problème est que cela fonctionnait bien jusqu'à ce que je remplace mes appels de service individuels dans le contrôleur par q.all et dans les tests scope.$apply avec rootScope.$digest. Avec q.all et rootScope.$digest (a essayé d'utiliser scope.$apply également) les deux tests échouent avec une erreur:

10 $ itérations digest () atteintes. Abandon!

si je supprime rootScope.$digest alors les promesses ne sont jamais résolues et les tests échouent en disant

attendue indéfinie à définir.

Toute aide, comment devrais-je tester le code avec q.all?

tombé sur ce post

Mais cela n'aide pas non plus, car j'essaie déjà d'utiliser $digest.

31
Rahul R.

Vous pouvez essayer de mettre $rootScope.$apply() dans une fonction de rappel afterEach(). Les promesses se résolvent sur $apply() en angulaire.

afterEach(function(){
    rootScope.$apply();
});
62
Thomas Schultz