2013-05-01 15 views
30

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.

Antwort

61

Sie können versuchen, in eine afterEach() Callback-Funktion zu setzen. Versprechen lösen sich auf $apply() in Angular.

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

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) –

+1

$ scope.apply() hat den Trick für mich – Mikey

+14

'$ gelten 'erhält normalerweise einen Rückruf. Ich bevorzuge 'scope. $ Digest()', das nur den aktuellen Bereich verdaut, so hat eine bessere Leistung. –

Verwandte Themen