Подтвердить что ты не робот

Как разрешить $q.all promises в модульных тестах Jasmine?

Мой контроллер имеет код, как показано ниже:

$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, data2 не undefined..

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.$apply с помощью rootScope.$digest. С q.all и rootScope.$digest (с использованием scope.$apply) оба теста с ошибкой заканчиваются:

10 $digest() итераций. Aborting!

если я удалю rootScope.$digest, тогда promises никогда не получит разрешения и тесты не сработают, говоря

ожидается undefined.

Любая помощь, как я должен модулировать код с помощью q.all?

натолкнулся на этот пост

Но это также не помогает, поскольку я уже пытаюсь использовать $digest.

4b9b3361

Ответ 1

Вы можете попробовать поставить $rootScope.$apply() в функцию обратного вызова afterEach(). Promises разрешить $apply() в Angular.

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