Angularjs 是否可以/应该测试自定义$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: {

在角度服务中,我有$resource操作方法,例如:

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);