2017-03-09 1 views
0

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

はバーテスト可能でしょうか?

私は既にgetAllFoo()などのメソッドのテストを行っていますが、$ resourceアクションメソッドについてはあまりよく分かりません。


this.FooService.Foo.bar(params).$promise.thenのように、コントローラで直接使用することはできますか?

テストする必要がありますか? もしそうなら、どうですか?

編集:私はgetAllFooを()をテストする方法を知っている :

describe('FooService',() => { 
    let $rootScope, $resource, $httpBackend, $log, $interval; 
    let makeFooService, translateMock; 
    let mockAllFoo = [ 
     {"id": 123,"stuff": "asdf asdf"}, 
     {"id": 124,"stuff": "hjghjg"} 
    ]; 

    beforeEach(window.module(FooModule.name)); 

    beforeEach(inject((_$rootScope_, $q, _$resource_, _$httpBackend_, _$log_) => { 
     $rootScope = _$rootScope_; 
     queryDeferred = $q.defer(); 
     $resource = _$resource_; 
     $httpBackend = _$httpBackend_; 
     $log = _$log_; 
     translateMock = { use:() => ({}) }; 
     makeFooService =() => new FooService(_$resource_); 
    })); 

    afterEach(function() { 
     $httpBackend.verifyNoOutstandingExpectation(); 
     $httpBackend.verifyNoOutstandingRequest(); 
    }); 
    describe('Service',() => { 
    it('has a resource-property [Foo]',() => { 
     let service = makeFooService(); 
     expect(service.Foo).not.toBeNull(); 
    }); 

    it('should load all foos when getAllFoo() is called',() => { 
     $httpBackend.expect('GET', /(.+)\/foo/).respond(() => [200, mockAllFoo, 'success']); 
     let service = makeFooService(); 
     let allFoo = service.getAllFoo(); 
     $httpBackend.flush(); 
     expect(allFoo.length).toBe(2); 
    }); 

は、だから私は)(getAllFooを()テストする方法が、バーをテストする方法を知っていません。 barがテスト可能で、コントローラで直接使用できる場合は、getAllFoo()などのメソッドを実行している点がわかりません.getAllFoo()は$ resourceアクションメソッドのラッパーです。私はここでベストプラクティスの明確化が必要です。

+0

私はちょうど私のコードのタイプミスがあった、$リソース:$リソースは、あなたが約束を扱う必要のない特定の機能を提供し、あなたのようなVARに直接応答値を割り当てることができますアクションメソッドはテスト可能ですが、問題はありません。 – Olivvv

答えて

1

私はそれが良いアイデアのテストリソースだと思う、いくつかのリソースは、応答のトランスフォーマーやいくつかのロジックをURL要求を作成することができます。 Angularは、HTTPリクエストでhttpレスポンスを模擬できるようにするために、$ httpBackendをパフォーマーテストに提供します。

モック要求

$httpBackend.when('GET', '/foo').respond({foo: 'bar'}, {'A-Token': 'xxx'}); 

リリースHTTPレスポンス

$httpBackend.flush(); 

https://docs.angularjs.org/api/ngMock/service/$httpBackend

はい、私のオプションではありませんあなたが行う必要がある場合にのみ、 "ラッパー" を作成するために、そこに必要とされています実際のリソースを呼び出す前にいくつかのロジック。次のコードに似た何かをする必要があります。「バー」を試験するために

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

また、私はそれは、コントローラから直接リソースメソッドを呼び出す大丈夫だと思います。

var bar = this.FooService.Foo.bar(params); 

https://docs.angularjs.org/api/ngResource/service/$resource

+0

応答のためのThx。私は$ httpBackendに精通していて、FooService.Foo.barをテストするのに喜んで使用しますが、私がmake service = makeFooService()を実行すると、テストセットアップでは利用できません。 - 私はこれらのサービスメソッドを直接テストする方法も、それを使用するコントローラをテストする方法も分かりません(もっと重要です)。回避策として、私はサービス内にメソッドを作成することができます:getBar(){return this.Foo.bar(); }しかし、これはあまりエレガントでない感じです – Olivvv

+0

助けてくれてありがとう、最後のばかげた真実は私がテストでモジュールを適切にインポートしなかったことです。 – Olivvv

+0

ですので、あなたの答えは技術的に正しいです – Olivvv

関連する問題