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

现在,我想测试一下,当调用Api.MakePost({},{data: {}}, function () {})正确的标头数据时,即在这种情况下'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'设置是否正确。是否可以使用 $httpBackend、Jasmine 和间谍在 angularjs 中测试这个场景?

4

1 回答 1

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可以更彻底地测试提供的参数,例如transformRequest可以resourceFactoryStub.calls.first()[2].transformRequest直接使用和测试方法。

或者整个事情可以在另一个测试中用$httpBackend和 real进行测试$resource

于 2017-04-19T00:46:46.297 回答