クラスのプライベートメソッドでJasmineユニットテストフレームワークのスピオンメソッドを使用することは可能ですか?
ドキュメントにはこの例がありますが、これはプライベート機能に柔軟に対応できますか?
describe("Person", function() {
it("calls the sayHello() function", function() {
var fakePerson = new Person();
spyOn(fakePerson, "sayHello");
fakePerson.helloSomeone("world");
expect(fakePerson.sayHello).toHaveBeenCalled();
});
});
前もって感謝します
汎用パラメーター<any>をspyon()関数に追加するだけです:
spyOn<any>(fakePerson, 'sayHello');
それは完全に動作します!
オブジェクトにTypeScriptを使用する場合、関数は実際にはプライベートではありません。
必要なのは、spyOn
呼び出しから返された値を保存し、calls
プロパティのクエリを実行することだけです。
最後に、このコードはあなたのためにうまくいくはずです(少なくとも私にとってはうまくいきました):
describe("Person", function() {
it("calls the sayHello() function", function() {
var fakePerson = new Person();
// save the return value:
var spiedFunction = spyOn(fakePerson, "sayHello");
fakePerson.helloSomeone("world");
// query the calls property:
expect(spiedFunction.calls.any()).toBeFalsy();
});
});
TypeScriptはjavascriptにコンパイルされ、javascriptではすべてのメソッドがパブリックになります。したがって、配列インデックス表記を使用して、プライベートメソッドまたはフィールドにアクセスできます。
Object['private_field']
詳細については、 ブログをフォロー をご覧ください。
インスタンスのコンテキスト外でプライベート関数にアクセスすることはできません。
ところで、テストしたいオブジェクトをスパイすることはお勧めできません。テストするクラス内の特定のメソッドが呼び出されるかどうかをテストするとき、何も言われません。あなたがテストを書いて合格したとしましょう。2週間後、あなたは関数のいくつかの要素をリファクタリングし、バグを追加します。したがって、テストはまだ緑色であるため、関数が呼び出されます。 B
Dependency Injection で作業する場合、スパイは便利です。すべての外部依存関係はコンストラクターによって渡され、クラスで作成されません。したがって、dom要素を必要とするクラスがあるとしましょう。通常、この要素を取得するには、クラスでjqueryセレクターを使用します。しかし、その要素で何かが行われたことをどのようにテストしたいのでしょうか?テストページhtmlに追加できます。ただし、コンストラクターで要素を渡してクラスを呼び出すこともできます。そうすることで、スパイを使用して、クラスが期待どおりにその要素と対話するかどうかを確認できます。
クラス内のプライベート関数をテストする場合、プライベート関数が返されることを通知するコンストラクターをクラスに追加してみませんか?
これを読んで、私が何を意味するかを確認してください: http://iainjmitchell.com/blog/?p=255
私は同様のアイデアを使用しており、これまでのところうまく機能しています!
私の場合(TypeScript):
jest.spyOn<any, string>(authService, 'isTokenActual')
または、モックされた結果:
jest.spyOn<any, string>(authService, 'isTokenActual').mockImplementation(() => {
return false;
});