2017-09-26 6 views
0

So in meiner Fabrik habe ich eine Schleife, die HTTP-Aufrufe anfordert und fügt sie zu einem Versprechen Array. Ich mache dann eine $q.all auf das Ergebnis, um ein Modell zu bauen. Wenn ich komme, um das zu testen, kann ich HTTP nicht bekommen, um alle Anrufe zu machen, es macht nur den letzten, ich brauche es, um alle Anrufe zu machen und das Modell zu bauen. unten sehr abgeholzt Code, (I 7 Termine verwenden, aber wollte die Dinge kurz halten)Unit Test Mehrere HTTP-Anfragen

Fabrik-Code

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

Also, wenn ich dies zu testen kommen, ich habe so etwas wie (Ich habe eine Schleife versucht, aber das ist fehlgeschlagen).

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

So console.log ich die URL bekommen, und ich sehe die alle URL-Anforderungen sind die gleichen, sie nicht Aktualisierung zu sein scheinen, die

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

in diesem Fehler führt, weil es immer ist die zuletzt httpBackend.expectGET das ist genommen.

Was fehlt mir?

Antwort

0

Mein Problem war Mocking. Ich habe dies aus meinem Beispiel herausgelassen, weil ich dachte, dass es nicht relevant und Komplikation hinzugefügt wurde, aber um die Daten zu bauen, benutzte ich die Moment-JS-Bibliothek.

so

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

ist

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

Die factory.getMoment ist nur ein Wrapper für Moment, die Idee ist, ich über diese in den Unit-Tests um mich mit einer ‚gegeben reiten konnte 'Datum Objekt.

funciton getMoment(){ 
    return moment(); 
} 

Auf jeden Fall in meinen Tests, ich hatte diese

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

Denken, dass jedes Mal, dies nennen würde, es mir dieses mock geben würde wieder, denke ich falsch war, dass etwa.

Was ich tun musste, wie von einem Kollegen darauf hingewiesen wurde, war jasmine's clock mock zu verwenden.

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

Dann in meinem Test stellte ich mit

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

das Datum Zeit ein (die oben in einer Schleife)

ich meinen Spion entfernt habe, und ich habe jetzt die Daten und Anfragen funktionieren wie erwartet.

Hoffe, das hilft jemand anderem, der sich tagelang am Kopf kratzt und versucht herauszufinden, warum seine Tests nicht funktionieren!