2017-01-30 11 views
1

https://docs.angularjs.org/api/ngResource/service/ $ resource $ resourceのAPIから、呼び出すことのできる$ resourceメソッドにカスタムアクションがあることがわかりました。私の質問は、このカスタムアクションを持つサービスを模擬する方法ですか?

例えばBaseServiceのコードは次のようである:

angular.module('shared').factory('BaseService', function($resource) { 
    var resourceConfig = { 
     serverBaseUrl: AJAXConfig.ajaxUrl+"&resource_id=" 
    }; 

    var createResource = function(url, paramDefaults, actions) { 
     return $resource(resourceConfig.serverBaseUrl + url, 
      paramDefaults, actions); 
    }; 

    return { 
     createResource: createResource 
    }; 
}); 

BaseServiceに依存して別のTopServiceは、のようなものです:今、私はTopServiceのユニットテストコードを記述する必要が

angular.module('SomeModule').factory('TopService', 
    function($resource, BaseService) { 

    var listResource = BaseService.createResource('onSomeList', 
     null, { 
      getList: { 
      method: 'GET', 
      isArray: true 
      } 
     }); 

    var getSomeList = function() { 
     return listResource.getList().$promise; 
    }; 

    return { getSomeList : getSomeList }; 
} 

ので、私$を使用してBaseServiceを模擬してください:

module(function($provide) { 
    $provide.service('BaseService', function($q) { 
     .... 
    } 
} 

私はmock createResourceメソd) jasmine.createSpy( 'createResource')。and.callFake(...) を使用していますが、どのようにカスタムアクションgetList()をモックできますか?

更新:だからカスタムアクションは、標準名「取得」を持っているが、私はまだテストコードでそれを模擬する方法がわからない

 var listResource = BaseService.createResource('onSomeList', 
     null, { 
      get: { 
      method: 'GET', 
      isArray: true 
      } 
     }); 

:私はlistResourceのに単純化することができることに気づきました。

答えて

0

私はあなたがリソースをモックする必要はありません。このよう

var getListMock = jasmine.createSpy(); 
module(function($provide) { 
    $provide.service('BaseService', function($q) { 
     return { 
       createResource:jasmine.createSpy().and.returnValue(getListMock) 
     } 
    } 
} 
0

にしてください。あなたはサービスを模擬する必要があります。テストの最上部にsharedを作成する代わりに、YourMocksを作成します。

YourMocksは次のようになります。

 
angular.module('YourMocks, []) 
.factory('TopService', function($q) { 
    return {getSomeList: function(){$q.when('your test data goes here')}; 
}); 
+0

しかし、これは右、TopServiceコードカバーされていないになるだろうか?私は高レベルで模擬することができますが、このテストコードはできるだけ多くのTopServiceコードをカバーしようとしていますので、実際のTopServiceと模擬BaseServiceを使用する必要があります。 –

+0

TopServiceコードをカバーする場合は、[$ http mock](https://docs.angularjs.org/api/ngMock/service/$httpBackend)を使用するためのドキュメントを参照する必要があります。ほとんどの場合、angle自身のコード(それ自体が広範にテストされています)のメソッドを呼び出すテストサービスでは気にしません。 –

+0

$ resourceを呼び出すサービスの上に別のレイヤーを追加する理由は、実際には分かりません。それは時間の無駄のようです。 –

関連する問題