2017-06-01 72 views
2

继承人什么我的服务一种看起来像如何测试角度服务函数嵌套承诺?

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

和IM尝试使用因果报应来测试这种方法initializeDefaults内的所有功能都运行。这意味着基本上所有的提取都发生了。继承人我有什么在目前的测试工作:

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

      service.initializeDefaults(); 

      rootScope.$apply(); 

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

回答

0

那么有2种方法可以去做这件事。

1)使用$ httpBackend:使用类似$ httpBackend.expectGET('url1').response(200,{})等等所有$ http calss你正在做的。然后调用$ httpBackend.flush(),它也应该执行所有嵌套的promise。下行:这将执行被调用方法中的所有逻辑。

2)使用茉莉花间谍:做这样的事情:

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 

无论是那些将工作。你的来电。 干杯。