2017-04-18 100 views
0

我有以下工廠。現在

services.factory('Api', ['$resource', function ($resource) { 

     return $resource(urlPath, { 
      'action': 'get', 
      'entity': 'Entity' 
     }, { 
      MakePost: { 
      method: "POST", 
      isArray: false, 
      headers: {'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'}, 
      transformRequest: function(obj) { 
       var str = []; 

       for (var p in obj) { 
       str.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])); 
       } 

       return str.join("&"); 
      } 
      } 
     } 
    ); 
    }]); 

,我想測試一下,在這種情況下'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'調用Api.MakePost({},{data: {}}, function() {})正確的標題數據即當設置正確。使用$ httpBackend,Jasmine和Spies來測試這個場景嗎?

回答

1

這可以通過單元和功能測試以兩種不同的方式進行測試。

$http相比,$resource包含更多移動部件,並且對它進行存根是有意義的 - 至少對於某些測試而言是有意義的。

beforeEach(module('app')) 
... 
describe('$resource is stubbed in this block',() => { 
    var resourceObjStub; 
    var resourceFactoryStub; 

    beforeEach(() => { 
    resourceObjStub = jasmine.createSpyObj(['MakePost']); 
    resourceFactoryStub = jasmine.createSpy().and.returnValue(resourceObjStub); 

    module({ $resource: resourceFactoryStub }); 
    }); 

    it('...', inject((Api) => { 
    expect(resourceFactoryStub).toHaveBeenCalledWith(
     ... 
     {...}, 
     { MakePost: { 
     headers: {...}, 
     transformRequest: jasmine.any(Function), 
     ... 
     } } 
    ); 
    expect(Api).toBe(resourceObjStub); 
    }); 
}); 

然後提供$resource參數可以被更徹底地測試,例如,用resourceFactoryStub.calls.first()[2].transformRequest可以達到transformRequest方法並直接進行測試。

或者整個事情可以在另一個測試$httpBackend和真正$resource進行測試。