私たちはサービスの単体テストを行っており、依存サービスの引数を持つメソッドをスパイするという問題に直面しています。
ServiceA の単体テストを作成しています
ServiceA.js
angular.module("App").service("ServiceA", function($http, ServiceB) {
this.detail = null;
this.method = function(id){
var sevrB = new ServiceB();
return sevrB.getId(1).then(function(response) {
this.detail = response.data;
});
};
});
ServiceB.js (ファクトリーです)
(function () {
var dependencies = [
'../module'
];
define(dependencies, function (module) {
return module.factory('ServiceB', function ($http) {
var ServiceB= function () {
this.id = null;
};
ServiceB.prototype.getId = function(Id) {
return $http.get('/test/');
}
}
}());
単体テスト コード
describe('Testing ServiceA', function () {
var serviceA, serviceBMock;
beforeEach(function () {
var _serviceBMock = function () {
return {
getId:function(id){
return 'test';
}
};
};
angular.module('ServiceAMocks', [])
.value('ServiceB', _serviceBMock);
});
beforeEach(module('ServiceAMocks'));
beforeEach(inject(function (_ServiceA_, _ServiceB_) {
serviceA=_ServiceA_;
serviceBMock=_ServiceB_;
});
it('retrive Id', function () {
spyOn(serviceBMock,'getId').and.Return('test');
serviceA.method(1);
});
});
ServiceA から ServiceB の getId メソッドをスパイしています。 ServiceB を関数としてモックした場合、以下のエラーが発生します
エラー: jasmineInterface.spyOn に getId() メソッドが存在しません
serviceB をオブジェクトとしてモックすると、エラーが発生します
TypeError: object is not a function
var _serviceBMock = {
getId:function(id){
return 'test';
}
}
そして、このシナリオで約束をテストするかどうかはわかりません。