Mein Controller-Code wie unten:
$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];
});
Und in meinen Unit-Tests ich so etwas wie dies tue:
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;
});
Jetzt in meinem Test i Überprüfung mich, ob Dienste und die data1 genannt werden, Daten2 ist nicht undefiniert ..
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();
});
mein Problem ist, dies funktioniert gut, bis ich meine individuellen Service-Anrufe in der Steuerung mit q.all ersetzt und in Tests scope.$apply
mit rootScope.$digest
. Mit q.all und rootScope.$digest
(versucht mit scope.$apply
auch) beiden Tests nicht mit Fehlern:
10 $digest() iterations reached. Aborting!
wenn ich entferne rootScope.$digest
dann die Versprechungen nie Entschlüsse bekommen und Tests nicht sagen
expected undefined to be defined.
Jede Hilfe, wie sollte ich Unit-Tests Code mit q.all
?
kam über this post
Aber das auch als i $digest
zu verwenden versucht, bin schon nicht hilft.
Falls Sie sich fragen, wo ist das dokumentiert: [Unterschiede zwischen Kris Kowal von Q und $ q] (http://docs.angularjs.org/api/ng/service/$q#differences-between-kris- kowal-sq-and-q) & [Testen] (http://docs.angularjs.org/api/ng/service/$q#testing) –
$ scope.apply() hat den Trick für mich – Mikey
'$ gelten 'erhält normalerweise einen Rückruf. Ich bevorzuge 'scope. $ Digest()', das nur den aktuellen Bereich verdaut, so hat eine bessere Leistung. –