[解決済み] Jasmineを使ってAngularJSのサービスをテストするにはどうすればよいですか?
質問
(関連する質問はこちらです。 Jasmineのテストでは、AngularJSモジュールが表示されません。 )
Angularをブートストラップせずにサービスをテストしたいだけなのです。
私はいくつかの例とチュートリアルを見ましたが、私はどこにも行きません。
3つだけファイルがあります。
-
myService.js:AngularJSのサービスを定義します。
-
test_myService.js: サービスに対するJasmineのテストを定義します。
-
specRunner.html: 通常のjasmineの設定を含むHTMLファイルです。 で、前の2つの他のファイルとJasmine、Angularjs、angular-mocks.jsをインポートしています。
これはサービスのコードです(私がテストしていないときは期待通りに動作します)。
var myModule = angular.module('myModule', []);
myModule.factory('myService', function(){
var serviceImplementation = {};
serviceImplementation.one = 1;
serviceImplementation.two = 2;
serviceImplementation.three = 3;
return serviceImplementation
});
私はサービスを分離してテストしようとしているので、私はそれにアクセスし、それらのメソッドをチェックすることができるはずです。 私の質問は、AngularJSをブートストラップせずにテストにサービスを注入するにはどうすればよいですか?
例えば、どのように私はこのようにJasmineでサービスのメソッドのために返される値をテストすることができます。
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myModule = angular.module('myModule');
//something is missing here..
expect( myService.one ).toEqual(1);
})
})
});
どのように解決するのですか?
問題は、サービスをインスタンス化するファクトリーメソッドが、上記の例では呼び出されていないことです(モジュールを作成するだけでは、サービスのインスタンス化は行われません)。
サービスをインスタンス化するために angular.injector は、サービスが定義されているモジュールで呼び出されなければなりません。それから、サービスのために新しいインジェクタオブジェクトを要求することができ、サービスが最終的にインスタンス化されるのはその時だけです。
このように動作します。
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
var $injector = angular.injector([ 'myModule' ]);
var myService = $injector.get( 'myService' );
expect( myService.one ).toEqual(1);
})
})
});
もう一つの方法は、サービスを関数に渡すことで、' 呼び出し ':
describe('myService test', function(){
describe('when I call myService.one', function(){
it('returns 1', function(){
myTestFunction = function(aService){
expect( aService.one ).toEqual(1);
}
//we only need the following line if the name of the
//parameter in myTestFunction is not 'myService' or if
//the code is going to be minify.
myTestFunction.$inject = [ 'myService' ];
var myInjector = angular.injector([ 'myModule' ]);
myInjector.invoke( myTestFunction );
})
})
});
そして最後に、「正しい」方法として、' インジェクト ' と ' モジュール ' の中に、' の前に というjasmineのブロックに注入します。 その際、'inject'関数がangularjsの標準パッケージではなく、ngMockモジュールに含まれていること、そしてjasmineでのみ動作することを認識する必要があります。
describe('myService test', function(){
describe('when I call myService.one', function(){
beforeEach(module('myModule'));
it('returns 1', inject(function(myService){ //parameter name = service name
expect( myService.one ).toEqual(1);
}))
})
});
関連
-
angularjs ローカルデータストレージ LocalStorage
-
[解決済み] angularJSのSTATEを理解する
-
[解決済み] select 要素のデフォルト値を設定するための ng-option の使用方法
-
[解決済み] AngularJs ReferenceError: $http is not defined
-
[解決済み] angularjsでチャートを作成する【終了】。
-
AngularJSのベストプラクティス。ng-repeatの$indexに注意する。
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] AngularJSで$scope.$watchと$scope.$applyを使用するにはどうすればよいですか?
-
[解決済み] AngularJS 。非同期データでサービスを初期化する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] data-ng-file-selectが動作しないのはなぜですか?
-
[解決済み] ajaxリクエスト時にAngularjsのローディング画面が表示される。
-
[解決済み] Angular ng-repeatの条件付きラップアイテム(ng-repeatのグループアイテム)。
-
[解決済み] ディレクティブ '...' が要求するコントローラ 'ngModel' が見つかりません。
-
[解決済み] AngularJS の ng-disabled ディレクティブに式を指定しても動作しない
-
[解決済み] AngularJS : ローカルストレージを使用する
-
角型グローバル確認ボックス
-
angularjsのルーティングについて $stateと$stateParamsの話
-
[解決済み] Jasmineの "callThrough "と "callFake() "の実用的な例が欲しい
-
[解決済み] 入力フィールドにフォーカスを当てるには?