如果在发出http请求时包含特定标头,如何测试$ resource调用?

时间:2017-04-18 17:03:46

标签: angularjs jasmine tdd angularjs-ng-resource

我有以下工厂。

undefined method 'folder_id' for nil:NilClass 

现在,我想在调用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 () {})设置正确。有没有使用$ httpBackend,Jasmine和间谍在angularjs中测试这个场景?

1 个答案:

答案 0 :(得分: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参数可以更彻底地测试,例如可以使用transformRequestresourceFactoryStub.calls.first()[2].transformRequest方法联系并直接测试。

或者可以使用$httpBackend和真实$resource在另一项测试中测试整件事。