2017-06-01 5 views
2

Heres was für meinen Service sieht aus wieWie testet man eine eckige Service-Funktion verschachtelte Versprechen?

TestService.initializeDefaults = function() { 
     var qPromise = $q.defer(); 
     $q.all({localResource : localResource.fetch(), 
       item : itemResource.fetch()}).then(function(directories){ 

      //stuff happens with directories 
      $q.all({ 
       thing1 : anotherThingFetch.fetch(), 
       thing2: someThingFetch.fetch(), 
       thing3: thingFetch.fetch() 
      }).then(function(funData) { 
       //stuff happens with the data 

       preventiveServicesService.fetch().then(function() { 

        //stuff happens 
       }); 

      }); 
     }.bind(this)); 
     return qPromise; 
    }; 

Und Im Versuch, Karma zu verwenden, um zu testen, dass alle Funktionen innerhalb dieser initializeDefaults Methode ausgeführt haben. Das bedeutet, dass im Wesentlichen alle Fohlen passiert sind. Heres, was ich habe, dass im Test so weit funktioniert:

it("should initialize defaults (Scenario 1)", function() { 

      service.initializeDefaults(); 

      rootScope.$apply(); 

      expect(localResourceMock.fetch).toHaveBeenCalledWith(); 
      expect(itemResourceMock.fetch).toHaveBeenCalledWith(); 

Antwort

0

Nun, es gibt 2 Möglichkeiten, die Sie darüber gehen können.

1) Benutze $ httpBackend: benutze etwas wie $ httpBackend.expectGET ('url1'). Antworte (200, {}) und so weiter für all die $ http, die du machst. Rufen Sie dann $ httpBackend.flush() auf und es sollten alle verschachtelten Versprechen auch ausgeführt werden. Nachteil: Dies führt alle Logik in den Methoden, die aufgerufen werden.

2) Verwenden Sie Jasmine Spione: Sie so etwas wie:

let deferred = $q.defer(); 
deferred.resolve(/*data you expect the promise to return*/); 
spyOn(localResourceMock, 'fetch').and.returnValue(deferred.promise); 
spyOn(itemResource, 'fetch').and.returnValue(deferred.promise); 

spyOn(anotherThingFetch, 'fetch').and.returnValue(deferred.promise); 
/*And so on for all methods being invoked*/ 

// Invoke the method 
service.initializeDefaults(); 

// Trigger digest cycle 
rootScope.$digest(); 

/*Expect all the spies to have been called*/ 
expect(anotherThingFetch.fetch).toHaveBeenCalledWith(); // will now pass 

eine der beiden funktionieren. Ihr Anruf. Prost.