在使用$resource
对服务进行单元测试时,最佳做法是什么 - 使用$httpBackend
或模拟资源?
我有以下服务:
angular.module('example')
.factory('MyService', ['$resource',
function($resource) {
var service = $resource('/api/example/', {}, {
create: {
method: 'POST'
}
});
var create = function(payload) {
return service.create({}, payload).$promise;
};
return {
create: create
};
}
]);
使用$ httpbackend
describe('#create', function() {
it('should send a post request to api/example', function() {
$httpBackend.expectPOST('/api/example')
.respond({
name: 'Something'
});
MyService.create({ example: 'payload' }});
$httpBackend.flush();
expect(MyService.create).toEqual({example: 'payload'})
});
});
答案 0 :(得分:2)
在测试服务时,请使用$httpBackend
。它被设计为常规$http
模块的替代品,因此您可以通过$resource
保证您的服务通话,并且返回做正确的事情。
如果你要模仿$resource
,那么你几乎不会行使代码路径。您还可以通过服务的实现来纠缠您的测试,这可能会从使用$resource
直接转换为使用$http
或第三个模块。您的测试并不关心如何进行HTTP调用,只是它是正确的调用并返回一些预期的数据。
当您测试系统的某些部分而不是服务时,请嘲笑。在这种情况下,您只需要MyService.create
来返回特定对象,而您并不关心它是如何获得的。没有理由将非服务测试与服务需要进行的HTTP调用联系起来。