Мой контроллер имеет код, как показано ниже:
$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.$apply
на rootScope.$digest
. С q.all и rootScope.$digest
(также пытался использовать scope.$apply
) оба теста завершаются с ошибкой:
Достигнуто 10 итераций $digest(). Прерывание!
если я удалю rootScope.$digest
, то обещания никогда не будут разрешены, а тесты не сработают, говоря
ожидается, что undefined будет определено.
Любая помощь, как я должен код модульных тестов с q.all
?
наткнулся на этот пост
Но это тоже не помогает, так как я уже пытаюсь использовать $digest
.