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のに単純化することができることに気づきました。
しかし、これは右、TopServiceコードカバーされていないになるだろうか?私は高レベルで模擬することができますが、このテストコードはできるだけ多くのTopServiceコードをカバーしようとしていますので、実際のTopServiceと模擬BaseServiceを使用する必要があります。 –
TopServiceコードをカバーする場合は、[$ http mock](https://docs.angularjs.org/api/ngMock/service/$httpBackend)を使用するためのドキュメントを参照する必要があります。ほとんどの場合、angle自身のコード(それ自体が広範にテストされています)のメソッドを呼び出すテストサービスでは気にしません。 –
$ resourceを呼び出すサービスの上に別のレイヤーを追加する理由は、実際には分かりません。それは時間の無駄のようです。 –