これには 2 つの方法があります。
- 関数呼び出しをスパイし、偽の値を返します。
- モック クラス (および場合によってはそれらを初期化するためのモック データ) を作成し、必要な場所にロードします
最初のものは、いくつかの呼び出しを偽造するだけでよい場合に問題ありません。クラス全体でそれを行うことは持続不可能です。
たとえば、いくつかの特別な URL を作成するサービスがあるとします。メソッドの 1 つが absUrl に依存している場合、$location
オブジェクト内のメソッドをスパイすることで偽装できます。
describe('example') function () {
beforeEach(inject(function () {
spyOn($location, 'absUrl').andCallFake(function (p) {
return 'http://localhost/app/index.html#/chickenurl';
});
}));
it('should return the url http://www.chicken.org') ... {
// starting situation
// run the function
// asserts
}
ここSettings
で、サーバーへのリモート呼び出しを使用して初期化される、言語、テーマ、特別なパス、背景色、書体などのデータをカプセル化する Service があるとします。に依存するサービスをテストするのSettings
は苦痛です。毎回、spyOn で大きなコンポーネントをモックする必要があります。10個のサービスがある場合...それらすべてにspyOn関数をコピーペーストしたくありません。
ServiceA
使用するSettings
サービス:
describe('ServiceA', function () {
var settings, serviceA;
beforeEach(module('myapp.mocks.settings')); // mock settings
beforeEach(module('myapp.services.serviceA')); // load the service being tested
beforeEach(inject(function (_serviceA_, _settings_) {
serviceA = _serviceA_;
settings = _settings_;
}));
このテスト スイートのコンテナーでは、Settings
サービスへのすべての呼び出しがモックによって処理されます。このモックは、実際のインターフェイスと同じインターフェイスを持ちますが、ダミーの値を返します。このサービスはどこでもロードできることに注意してください。
(何らかの理由で実際の実装を使用する必要がある場合は、モックの前に実際の実装をロードし、その特定のケースで spyOn を使用して呼び出しを実際の実装に委譲することができます。)
通常、モック モジュールは app フォルダーの外に配置します。test
単体テスト、e2e テストを含むフォルダーlib
と、angular-mocks.js ファイルを含むフォルダーがあります。モックもそこに置きます。テストに必要なファイルを karma に伝えます。
files: [
'app/lib/jquery/jquery-1.9.1.js',
'test/lib/jasmine-jquery.js',
'app/lib/angular/angular.js',
'app/lib/angular/angular-*.js',
'test/lib/angular/angular-mocks.js',
'test/lib/myapp/*.js', /* this is mine */
'app/js/**/*.js',
'test/unit/**/*.js'
],
このファイルtests/lib/myapp.mocks.settings.js
は、他のモジュールと同じように見えます。
(function () {
"use strict";
var m = angular.module('myapp.mocks.settings', []);
m.service('settings', function () { ... })
})
2 番目の問題 (オプション): ダミー値をすばやく変更したい。この例では、設定サービスは、初めてインスタンス化されるときにサーバーからオブジェクトを取得します。次に、サービスにはすべてのフィールドのゲッターがあります。これはサーバーへの一種のプロキシです。値が必要になるたびにリクエストを送信する代わりに、それらの束を取得してローカルに保存します。私のアプリケーションでは、実行時にサーバーの設定が変更されません。
何かのようなもの:
1. fetch http://example.org/api/settings
2. var localSettings = fetchedSettings;
3 getFieldA: function() { return localSettings.fieldA; }
グローバル名前空間を汚染します。settings.data.js
次のような内容のファイルを作成しました。
var SETTINGS_RESPONSE = { fieldA: 42 };
モック サービスは、ファクトリでこのグローバル変数を使用してインスタンス化します。localSettings