2011-12-12 37 views
5

に使用することは、クラスプライベートメソッドに対してJasmineユニットテストフレームワークのspyonメソッドを使用することは可能ですか?Jasmine spyonをプライベートメソッド

ドキュメントにはこの例がありますが、これは私的な機能に柔軟に対応できるのですか?事前

答えて

4

ません原因で

describe("Person", function() { 
    it("calls the sayHello() function", function() { 
     var fakePerson = new Person(); 
     spyOn(fakePerson, "sayHello"); 
     fakePerson.helloSomeone("world"); 
     expect(fakePerson.sayHello).toHaveBeenCalled(); 
    }); 
}); 

おかげで、あなたのインスタンスのコンテキスト外でプライベート関数にアクセスするカント。

Btw、あなたがテストしたいオブジェクトを偵察するのは良い考えではありません。あなたがテストしたいあなたのクラスの特定のメソッドが呼び出されたかどうかをテストするとき、何も言わない。あなたがテストを書いたと言うと、2週間後に関数の中のいくつかのものをリファクタリングしてバグを追加します。だからあなたのテストはまだ緑色であるので、あなたはその関数を呼び出します。 B

スパイはDependency Injectionで作業するときに便利です。すべての外部依存関係はコンストラクタによって渡され、クラスには作成されません。したがって、dom要素が必要なクラスがあるとします。通常、この要素を取得するには、クラスのjqueryセレクタを使用します。しかし、その要素で何かが行われていることをどのようにテストしたいのですか?もちろん、テストページhtmlに追加することができます。しかし、コンストラクタで要素を渡してクラスを呼び出すこともできます。そうすることで、スパイを使ってクラスが期待通りにその要素とやりとりするかどうかを確認できます。

+16

「テストしたいオブジェクトをスパイするのは良い考えではない」と言っても間違いです。スパイの使用は、機能が単に呼び出されたのではなく、それだけであるかどうかをチェックすることに限定されません。スパイを使用して戻り値をチェックしたり、テストケースのために関数を完全に置き換えたり、エラーを投げたりすることができます。ジャスミンのドキュメントを読んで、より完全な理解を得ることをお勧めします。 –

+1

スパイするのは良いアイデアじゃないの?あなたはもっと間違っていることはできません!イェップ私はティムと同意し、あなたはドコを見て、誰がこれを投票したのですか? –

+0

それは私が言ったことではありません。スパイを使ってもOKです。しかし、あなたはブラックボックスとしてテストしたいオブジェクトを扱うべきです。出入りするものだけをテストします。ブラックボックスの内部をテストしないでください。テスト中のオブジェクトのメソッドを詮索した場合、あなたは何をするでしょうか。だから、あなたがオブジェクトに渡すコールバックのスパイはまったく問題ありません。 –

0

クラス内のプライベート関数をテストする場合は、そのプライベート関数が返されることを通知するコンストラクタをクラスに追加しないでください。

は、私が何を意味するかを確認するには、この一読をお持ちの:http://iainjmitchell.com/blog/?p=255私は同様のアイデアを使用していると、これまでその偉大なワークアウト

+5

あなたがprivatメソッドを公開した場合、それはもはやprivatではありません。Btw、私が私の答えで説明したように、それはprivatメソッドをテストするのはあまり意味がありません。 –

+0

それに同意することはできません。私たちのjavascriptコードベースは大規模なものであり、私たちはいくつかのクラスで公開されている関数/プロパティの手のひらを公開しています。これらのプライベート関数では多くのロジックが処理されます。私は公開メソッドしか公開していないので、テストフレームワークはそれにアクセスできます。コンストラクタが正しく呼び出されない場合、private関数は返されません。 – StevenMcD

+1

このトピックには良いことがあります:http://stackoverflow.com/q/7075938/184883 –

3

オブジェクトに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(); 
    }); 
}); 
+4

非エクスポート(プライベート)関数を呼び出そうとすると、タイプエラーが発生します: 'エラー:(33,56)TS2345:' "sayHello" '型の引数が' 'sayGoodbye' '型のパラメータに代入できません'sayGoodbye'は' Person'の公開メソッドで 'sayGoodbye'は非公開です。私はそれをどんなものにでもキャストしなければなりません(どんなものでもsayHello) – FlavorScape

+0

私はここでより多くの文脈が必要です。あなたの割り当てがうまくいかず、プライベート関数へのアクセスではないようです。 しかし、 'person.sayHello'の代わりに' person ["sayHello"] 'のようにアクセスしてみてください。 これはベストプラクティスではありませんが、まれにしか許されません。 – jurl

1

ただ、一般的なパラメータ<いずれかを追加>spyon()関数へ:

は、
spyOn<any>(fakePerson, 'sayHello'); 

完璧に機能します!

関連する問題