[解決済み] AngularJSのサービスにモックをインジェクションする
2022-09-07 01:08:40
質問
AngularJSのサービスを書いているのですが、ユニットテストをしたいです。
angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']).
factory('myService', function ($http, fooService, barService) {
this.something = function() {
// Do something with the injected services
};
return this;
});
私のapp.jsファイルには、これらが登録されています。
angular
.module('myApp', ['fooServiceProvider','barServiceProvider','myServiceProvider']
)
このようにDIが動作していることがテストできます。
describe("Using the DI framework", function() {
beforeEach(module('fooServiceProvider'));
beforeEach(module('barServiceProvider'));
beforeEach(module('myServiceProvder'));
var service;
beforeEach(inject(function(fooService, barService, myService) {
service=myService;
}));
it("can be instantiated", function() {
expect(service).not.toBeNull();
});
});
これでDIフレームワークでサービスを作成できることが証明されましたが、次にサービスをユニットテストしたいのですが、これは注入されたオブジェクトをモック化することを意味します。
どのようにすればよいのでしょうか?
モジュール内にモックオブジェクトを配置してみました。
beforeEach(module(mockNavigationService));
というように、サービス定義を書き換えます。
function MyService(http, fooService, barService) {
this.somthing = function() {
// Do something with the injected services
};
});
angular.module('myServiceProvider', ['fooServiceProvider', 'barServiceProvider']).
factory('myService', function ($http, fooService, barService) { return new MyService($http, fooService, barService); })
しかし、後者はDIによって作成されるサービスをすべて停止してしまうようです。
誰か、私のユニットテストのために注入されたサービスをモック化する方法を知っていますか?
ありがとうございます。
デビッド
どのように解決するのですか?
モックをサービスに注入するためには
$provide
.
getSomethingというメソッドを持つ以下のようなサービスを依存関係で持っている場合。
angular.module('myModule', [])
.factory('myService', function (myDependency) {
return {
useDependency: function () {
return myDependency.getSomething();
}
};
});
以下のようにすれば、myDependencyのモック版をインジェクトすることができます。
describe('Service: myService', function () {
var mockDependency;
beforeEach(module('myModule'));
beforeEach(function () {
mockDependency = {
getSomething: function () {
return 'mockReturnValue';
}
};
module(function ($provide) {
$provide.value('myDependency', mockDependency);
});
});
it('should return value from mock dependency', inject(function (myService) {
expect(myService.useDependency()).toBe('mockReturnValue');
}));
});
を呼び出していることに注意してください。
$provide.value
を呼び出すため、実際にはどこにも明示的に myDependency を注入する必要がないことに注意してください。これは myService のインジェクションの際に、フードの下で行われます。ここで mockDependency を設定する場合、それは単にスパイである可能性もあります。
おかげさまで ロイヤルブラウン へのリンクに感謝します。 その素晴らしいビデオ .
関連
-
[解決済み] 配列に特定のインデックスで項目を挿入する方法 (JavaScript)
-
[解決済み] AngularJSでデータバインディングはどのように機能するのですか?
-
[解決済み] AngularJSを使用して、ブラウザのコンソールで$scope変数にアクセスするにはどうすればよいですか?
-
[解決済み] モックとスタブの違いは何ですか?
-
[解決済み] Mockitoでvoidメソッドをモックする方法
-
[解決済み] AngularJSのコントローラからビューにHTMLを挿入する
-
[解決済み] AngularJSのサービスをコンソールからテストするにはどうしたらいいですか?
-
[解決済み] JSのDateからDay名
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] JavaScriptでDIVを表示・非表示にするには?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] AngularJSのエラーです。Cross Origin リクエストはプロトコルスキーム http, data, chrome-extension, https に対してのみサポートされています。
-
[解決済み] 上級者向けJavaScript。この関数はなぜ括弧でくくられるのですか?重複
-
[解決済み] 文字列がすべて同じ部分文字列で構成されているかどうかを調べるにはどうすればよいですか?
-
[解決済み] reactのrender関数でdynamic hrefを作成するには?
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] 文字列が空白であるかどうかをチェックする
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] 変異を伴わないオブジェクトからの値の削除