2013-05-01 10 views
30

mio controller è dotato di un codice simile di seguito:

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

E nel mio test di unità sto facendo qualcosa di simile:

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

Ora nel mio test Sto controllando se i servizi sono chiamati e la data1, data2 non sono indefiniti ..

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

il mio problema è, questo stava lavorando bene fino a quando ho sostituito le mie chiamate di servizio individuali in con q.all e nei test scope.$apply con rootScope.$digest. Con q.all e rootScope.$digest (provato con scope.$apply pure) entrambi i test non riesce con l'errore:

10 $digest() iterations reached. Aborting!

se tolgo rootScope.$digest poi le promesse non arrivano mai si risolve e test fallisce dicendo

expected undefined to be defined.

Qualsiasi aiuto come dovrei unire il codice del test con q.all?

imbattuto this post

Ma anche non aiuta come sto già cercando di utilizzare $digest.

risposta

61

È possibile provare a inserire $rootScope.$apply() in una funzione di richiamata afterEach(). Promesse risolutive su $apply() in Angolare.

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

Nel caso in cui ti chiedi dov'è che documentate: [Differenze tra di Kris Kowal Q e $ q] (http://docs.angularjs.org/api/ng/service/$q#differences-between-kris- kowal-sq-and-q) & [testing] (http://docs.angularjs.org/api/ng/service/$q#testing) –

+1

$ scope.apply() ha fatto il trucco per me – Mikey

+14

'$ apply 'di solito riceve una richiamata. Preferisco 'scope. $ Digest()', che digerisce solo l'ambito corrente, quindi ha prestazioni migliori. –

Problemi correlati