1

コンセンサスは、TDDを実行するときにプライベートメソッドをテストしないことのようです。

プライベート/保護されたメソッドを単体テストする必要がありますか?

私はこれと同じシナリオを繰り返します。私はプライベートメソッドを持っています(例として、それはすべてのオプションをオフに切り替えます)。多くの状態を変更し、いくつかのパブリックメソッドによって呼び出されます。プライベートメソッドが状態に加える変更は、どのパブリックメソッドが呼び出されるかに関係なく同じままです(すべてのオプションがオフに設定されます)。

同じことを効果的に行う多くのテストを追加せずに、このプライベートメソッドの機能をテストするための最良の方法は何ですか?

ところで、私はQUnitを使用してJavascriptオブジェクトをテストしています。

これが私のクラスの過度に単純化されたバージョンです。

http://jsfiddle.net/twistedinferno/UMgAx/

編集

私がここで本当に尋ねようとしているのは、「プライベートメソッドをテストするべきかどうか」ではありません。それはすでに回答されており、その答えはノーです。私のプライベートメソッドを使用するため、アサーションの多くが同じになることを念頭に置いて、各パブリックメソッドをどのようにテストするのが最適かを知りたいです。同じプライベートメソッドが多くのパブリックメソッドによって呼び出されます。多くのパブリックメソッドのそれぞれがプライベートメソッドを呼び出すときに発生する状態変化をテストするために、重複するアサーションをたくさん持っていても大丈夫ですか?

テスト付きの新しいフィドル http://jsfiddle.net/twistedinferno/JHzWh/

4

3 に答える 3

4

パブリックメソッドをテストします。

または、より一般的には、オブジェクトの外向きに見えるインターフェイスをテストします。

プライベートメソッドがパブリックメソッドによって使用される場合、その使用は結果としてテストされます。ただし、プライベートメソッド自体はプライベートであるため、テストを含め、そのオブジェクトの外部には関係ありません。

これらのテストは、テストしているかどうかは言うまでもなく、そのようなプライベートメソッドが存在することさえ知らないか、気にするべきではありません。すべてのパブリック機能をテストする必要があります。

多くのテストが同じことをしている場合、それはパブリック機能に不必要な重複があることを示しているのでしょうか?多分そこにリファクタリングの余地がありますか?もちろん、コードを見なくても完全に推測です。例を挙げていただけますか?

編集

追加のアサーションは同じキーストロークを複製しますが、異なる外向きの機能をテストしているため、テストは明らかに異なります。複製されたアサーションは、各テストが呼び出す単一の関数にいつでもリファクタリングできます。カスタム集約アサーションの一種。パブリックメソッドが同じ観察可能な(そしてテスト可能な)振る舞いを持ち続ける限り、それは問題ありません。もちろん、変更するとすぐにテストも変更する必要があります。

于 2012-09-06T19:12:47.213 に答える
2

あなたがTDDを実践していることを考えると、問題のプライベートメソッドのコードの各行は、それを書く必要のあるテストがなければ存在しなかったと思います。これは、パブリックインターフェイスとは別にプライベート関数をテストする必要がないことを意味します。

ありがとう!

ブランドン

于 2012-09-07T02:35:42.967 に答える
1

私はbcarisoとDavidに同意します。プライベートメソッドをテストしたり、テストしたりする必要はありません。

注意すべき点の1つは、プライベートメソッドが非常に大きくて重要であり、テストする必要があると感じた場合は、それを独自のヘルパークラスのパブリックメソッドとして抽出することを検討する必要があるということです。

Javascriptでも同じ原則が適用されますが、それを公に見える関数、またはモジュール(そのパターンを使用する場合)にするだけです。

于 2012-09-07T03:46:20.603 に答える