2013-07-26 11 views
12

私はジャスミンを使って角型アプリケーションのテストケースをコーディングしていました。しかし、多くの内部メソッドは、サービス内でプライベートとして宣言されています。私的方法ジャスミンによるユニットテスト

例:

App.service('productDisplay', function(){ 
    var myPrivate = function(){ 
     //do sth 
    } 
    this.doOfferCal = function(product, date){ 
     //call myPrivate 
     //do sth too 
     return offer; 
    } 
}); 

それは簡単な「doOfferCal」のためのテストをコーディングするジャスミンを使用したが、私はあまりにもmyPrivateのためのユニットテストを書きたいです。

どうすればいいですか?

ありがとうございます。

+0

可能な重複[どのようにIプライベートメソッド、フィールド、または内部クラスを持つクラスをテストしますか?](https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that-has-private-methods-fields-or -inner-classes) – Raedwald

答えて

0

内部関数をテストするために、私は内部関数を呼び出す外部関数を呼び出してから、内部関数が必要とするものに従って入力を変更します。したがって、あなたのケースでは、 'productDisplay'を呼び出し、 'myPrivate'に必要なものに基づいて入力を変更し、期待される出力があることを確認します。あなたはまた、 'myPrivate'についてスパイすることができ、その方法を.havebeencalledwithまたは.andcallthroughを使ってテストすることができます。

8

プライベートメソッドをテストする具体的な理由はありますか?

doOfferCal()をテストすると、myPrivate()が正しいことを行っていることを暗黙のうちにテストしています。

これはRailsConf用ですが、Sandi Metzさんはwhat should be testedについて非常に良い話をしています。

+0

私の "doOfferCal"は多くのプライベートメソッドを呼び出し、最終的にそれぞれのプライベートメソッドをテストするのが良いと思った理由で複雑な結果を返します。ところで、あなたはこの状況で何か提案していますか? – arnold

+2

考え方の1つは、プライベートメソッドは実装の詳細です。プライベートメソッドをテストすることで、パブリックメソッドが正しく動作しているにもかかわらず、テストは中断されます。結果として、あなたは脆弱なテストを作成し、開発者が実装を改善/リファクタリングするのを恐れることになるかもしれません。 – achan

+2

申し訳ありませんが、入力を押すと私の投稿を提出する気になりませんでした。この場合、私は 'doOfferCal()'をテストし、それが返す複雑なオブジェクトを確認します。そのテストに合格すると、間にあるすべてのプライベートメソッドが意図したとおりに動作します。私はあなたがプライベートメソッドをサポートしている人を見つけられると確信していますが、これは有用でメンテナンス可能な単体テストを書く面で私が最もよく見いだしたものです。 – achan

2

アカンは100%の権利ですが、あなたが本当に(決して:-)どうあるべきか)あなたのテストでプライベートメソッドを呼び出す必要がある場合は、でそれを行うことができます。

var myPrivateSpy = spyOn(productDisplayService, "myPrivate").and.callThrough(); 
myPrivateSpy.call(); 
関連する問題