簡體   English   中英

如何測試$ resource調用是否包含發出HTTP請求時的特定標頭?

[英]How to test $resource calls if it contains specific headers on making http request?

我有以下工廠。

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("&");
            }
          }
        }
      );
    }]);

現在,當調用Api.MakePost({},{data: {}}, function () {})時,我想測試正確的頭數據,即在這種情況下為'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8' 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'設置正確。 是否可以使用$ httpBackend,Jasmine和間諜在angularjs中測試此方案?

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

$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在另一個測試中測試整個事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM