如果在发出 http 请求时包含特定的 headers,如何测试 $resource 调用?
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 () {})
时,正确的 header 数据即在这种情况下 '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
参数可以更彻底地测试,例如transformRequest
方法可以通过resourceFactoryStub.calls.first()[2].transformRequest
到达并直接测试。
或者整个事情可以在另一个测试中用 $httpBackend
和真实的 $resource
来测试。
我有下面这家工厂。
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 () {})
时,正确的 header 数据即在这种情况下 '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
参数可以更彻底地测试,例如transformRequest
方法可以通过resourceFactoryStub.calls.first()[2].transformRequest
到达并直接测试。
或者整个事情可以在另一个测试中用 $httpBackend
和真实的 $resource
来测试。