私はyeomanジェネレーターで作成されたアプリを使用しており、カルマでテストを行っています。
すべてのサービスに再利用可能なモック オブジェクトがあります。特定のサービスの依存関係をモックに正しく置き換えるにはどうすればよいですか。そうすれば、ジャスミンを使用してメソッドをスパイできます
これまでのところ、私はこのようにしています:
私のサービス:
angular.module('ql')
.service('loginService', ['$http','API','authService', function ($http, API, authService) {
return {
//service implementation
}]);
authService のモック:
'use strict';
//lets mock http auth service, so it would be spied upon.
ql.mock.$authServiceMockProvider = function() {
this.$get = function() {
var $service = {
loginConfirmed: function() { }
};
return $service;
};
};
//and register it.
angular.module('qlMock').provider({
$authServiceMock: ql.mock.$authServiceMockProvider
});
そして私のテスト:
'use strict';
describe('When i call login method()', function () {
// load the service's module
beforeEach(module('ql'));
beforeEach(angular.mock.module('qlMock'));
// instantiate service
var loginService,
authService,
$httpBackend;
beforeEach(function() {
// replace auth service with a mock.
// this seems kind of dirty... is there a bettery way?
module(function($provide, $injector){
authService = $injector.get('$authServiceMockProvider').$get();
$provide.value('authService', authService);
});
//actually get the loginService
/*jshint camelcase: false */
inject(function(_loginService_, _$httpBackend_) {
loginService = _loginService_;
$httpBackend =_$httpBackend_;
});
//http auth module method, that should be call only on success scenarios
spyOn(authService, 'loginConfirmed').andCallThrough();
});
it('it should do something', function () {
//actual test logic
});
});
私が気に入らないのは次の行です:
authService = $injector.get('$authServiceMockProvider').$get();
何らかの方法で authServiceMock を取得し (プロバイダーを取得せずに et メソッドを呼び出す)、それを loginService に挿入したいと考えています。
$authServiceMock を単純に authService と呼び、それをモックとして提供して、デフォルトの実装を常にオーバーライドできることは知っていますが、これを行いたくありません。