2017-09-26 1 views
0

Donc, dans mon usine, j'ai une boucle qui demande des appels HTTP et les ajoute à un tableau de promesses. Je fais ensuite un $q.all sur le résultat pour construire un modèle. Quand je viens tester cela, je n'arrive pas à faire passer tous les appels par HTTP, il ne fait que le dernier, j'en ai besoin pour faire tous les appels et construire le modèle. ci-dessous est très coupé le code vers le bas, (je l'utilise 7 dates, mais voulait garder les choses à court)Unité Test plusieurs requêtes HTTP

Code Factory

function getLatestData(){ 
    var dateArray= ['2017-09-21','2017-09-22'] 
    for (i = 0; i < 2; i++) { 
     var url = 'data-server/date/[i]'            
     promises.push(getData(url)); // getData is a simple $http function call. 
    } 
    return $q.all(promises).then(function(response){ 
    buildModel(reponse); 
    }); 
} 

Alors, quand je viens de tester, j'ai quelque chose comme (J'ai essayé une boucle mais ça a échoué).

httpBackend.expectGET('data-server/date/2017-09-21').respond(mockData[0]); 
httpBackend.expectGET('data-server/date/2017-09-22').respond(mockData[1]); 
rootScope.$apply(); 
    modelFactory.getLatestData().then(function(response){ 
      expect(response).toEqual(mockModelData); 
    }) 

Je CONSOLE.LOG l'URL get et je vois toutes les demandes d'URL sont les mêmes, ils ne semblent pas être mise à jour qui se traduit par cette erreur

Error: Unexpected request: GET 'data-server/date/2017-09-22' 
Expected GET 'data-server/date/2017-09-21' 

parce qu'il est toujours dernier httpBackend.expectGET c'est pris.

Qu'est-ce qui me manque?

Répondre

0

Mon problème était mocking. Je l'ai laissé en dehors de mon exemple parce que je pensais que ce n'était pas pertinent et ajouté complication, mais pour construire les dates j'ai utilisé la bibliothèque de momentJS.

si

var url = 'data-server/date/[i]' 

est

var url = 'data-server/date/'+factory.getMoment().add(i,'d').format('YYYY-MM-DD'); 

Le factory.getMoment est juste un emballage pour un moment, l'idée étant que je pouvais plus monter ce dans les tests unitaires pour me fournir une « donnée 'objet date.

funciton getMoment(){ 
    return moment(); 
} 

Quoi qu'il en soit dans mes tests, j'ai eu cette

var mockDate = moment('2017-09-21'); 
spyOn(factory, 'getMoment').and.returnValue(moment('2017-09-21')); 

httpBackend.expectGET('data-server/date/'+mockDate.format('YYYY-MM-DD').respond(mockData[0]); 
httpBackend.expectGET('data-server/date/'+mockDate.add(1,'d').format('YYYY-MM-DD').respond(mockData[1]); 

Pensant que chaque fois que ce serait appelé, il me rendrait ce simulacre, pense que je me suis trompé à ce sujet.

Ce que j'avais besoin de faire, comme l'a souligné un collègue, était d'utiliser jasmine's clock mock.

beforeEach(function() { 
    jasmine.clock().install(); 
}) 
afterEach(function() { 
    jasmine.clock().uninstall(); 
}) 

Puis dans mon test, je mis en place le temps de rendez-vous avec

mockDate = moment('2017-09-21'); // always use moment as JS date if badly broken and just can't be trusted! 
jasmine.clock().mockDate(mockDate.toDate()); 

httpBackend.expectGET('data-server/date/'+moment().add(0, 'days').format("YYYY-MM-DD").respond(mockData[0]);; 
httpBackend.expectGET('data-server/date/'+moment().add(1, 'days').format("YYYY-MM-DD").respond(mockData[1]);; 

(ci-dessus est dans une boucle)

J'ai enlevé mon espion et maintenant j'ai les dates et demande de travailler comme je m'y attendais. J'espère que cela aidera quelqu'un d'autre qui se retrouve à se gratter la tête pendant des jours en essayant de comprendre pourquoi leurs tests ne fonctionnent pas!