Angularjs 是否可以/应该测试自定义$resource操作方法?
在角度服务中,我有$resource操作方法,例如:Angularjs 是否可以/应该测试自定义$resource操作方法?,angularjs,unit-testing,ecmascript-6,jasmine,Angularjs,Unit Testing,Ecmascript 6,Jasmine,在角度服务中,我有$resource操作方法,例如: class FooService { /*@ngInject*/ constructor($resource) { this.Foo = $resource('/foo/:fooId/', {fooId: '@fooId'}, { bar: {
class FooService {
/*@ngInject*/
constructor($resource) {
this.Foo = $resource('/foo/:fooId/',
{fooId: '@fooId'},
{
bar: {
method: 'GET',
url: '/foo/:fooId/bar/',
isArray: true
}
);
}
getAllFoo() {
return this.Foo.query();
}
}
bar是可测试的吗
我已经对getAllFoo()等方法进行了测试,但对$resource操作方法我不是很确定
在控制器中直接使用它们可以吗,如在this.FooService.Foo.bar(params)。$promise.then
他们应该接受测试吗?
如果是,怎么做
编辑:
我知道如何测试getAllFoo():
所以我知道如何测试getAllFoo(),但不知道如何测试bar();
如果bar是可测试的,并且可以直接在控制器中使用,那么我看不出像getAllFoo()这样的方法有什么意义,它们只是围绕$resource操作方法进行包装。我需要澄清这里的最佳实践。我认为测试资源是个好主意,一些资源可以有响应转换器或一些逻辑来创建URL请求。Angular为http请求中的执行者测试提供$httpBackend,以便能够模拟http响应 模仿请求
$httpBackend.when('GET', '/foo').respond({foo: 'bar'}, {'A-Token': 'xxx'});
释放HTTP响应
$httpBackend.flush();
是的,在我的选项中,只有在调用实际资源之前需要执行一些逻辑时,才不需要创建“包装器”
为了测试“bar”,您需要执行类似于以下代码的操作:
it('should call the correct url and handler the response right', (done)=>{
$httpBackend.expect('GET', '/foo/bar_id/bar/').respond( () => [200, {'id': 124,'stuff': 'hjghjg'}, 'success'] );
let service = makeFooService();
service.bar({fooId: 'bar_id'}).$promise.then(result =>{
expect(result).toEqual({'id': 124,'stuff': 'hjghjg'});
done();
});
$httpBackend.flush();
});
另外,我认为可以直接从控制器调用resource方法$资源提供了一个特定的功能,您不需要处理承诺,您可以将响应值直接分配给var,如:
var bar = this.FooService.Foo.bar(params);
Thx用于应答。我编辑了这个问题,我熟悉$httpBackend,并且很乐意使用它来测试FooService.Foo.bar,但是当我让service=makeFooService();-我既不知道如何直接测试这些服务方法,也不知道如何测试使用它们的控制器(更重要)。作为一种解决方法,我可以在服务中创建一个方法:getBar(){return this.Foo.bar();}但这感觉不那么优雅谢谢你的帮助,荒谬的事实是我没有在测试中正确导入模块,因此没有找到方法。我只是在代码中有一个输入错误,$resource action methods是可测试的,没问题。
var bar = this.FooService.Foo.bar(params);