実装のテストよりもインターフェイスのテストを優先します。
プライベートメソッドはテストできないことは私の理解です
これは開発環境によって異なります。以下を参照してください。
[プライベートメソッド]は、パブリックAPIがオブジェクトの整合性を検証するのに十分な情報を提供するため、心配する必要はありません。
そうです、TDDはインターフェイスのテストに重点を置いています。
プライベートメソッドは、リファクタリングサイクル中に変更される可能性がある実装の詳細です。インターフェイスまたはブラックボックスの動作を変更せずにリファクタリングすることが可能であるべきです。実際、それはTDDの利点の一部であり、クラス内部の変更がそのクラスのユーザーに影響を与えないという自信を簡単に生成できることです。
さて、プライベートメソッドのみを持ち、イベントをリッスンすることで他のオブジェクトとやり取りするオブジェクトを作成することは可能です。これは非常にカプセル化されますが、完全にはテストできません。
クラスは何のpublicメソッドを持っていない場合でも、イベントハンドラは、それはですされているのですパブリックインターフェイス、およびそれにそのに対してその パブリックインターフェイスあなたがテストすることができます。
イベントはインターフェースなので、そのオブジェクトをテストするために生成する必要があるのはイベントです。
テストシステムの接着剤としてモックオブジェクトを使用することを検討してください。イベントを生成し、結果として生じる状態の変化を取得する単純なモックオブジェクトを作成できるはずです(別のレシーバーモックオブジェクトによって可能)。
また、テストのためにメソッドを追加するのは悪い習慣と考えられています。
絶対に、内部状態を公開することに非常に注意する必要があります。
これは、TDDがカプセル化と対立することを意味しますか?適切なバランスは何ですか?
絶対違う。
TDDは、クラスの実装を(おそらく前の時点からYAGNIを適用することによって)単純化する以外に変更すべきではありません。
TDDを使用したベストプラクティスは、TDDを使用しないベストプラクティスと同じです。開発中のインターフェイスを使用しているため、その理由がすぐにわかります。
私は今、私のメソッドのほとんどまたはすべてを公開したいと思っています...
これはむしろ、お風呂の水で赤ちゃんを捨てるでしょう。
TDD方式で開発できるように、すべてのメソッドをパブリックにする必要はありません。以下のメモを参照して、プライベートメソッドが実際にテストできないかどうかを確認してください。
プライベートメソッドのテストの詳細
言語/環境に応じて、クラスのプライベートな動作を絶対に単体テストする必要がある場合、3つのオプションがあります。
- テストするクラスにテストを配置します。
- テストを別のクラス/ソースファイルに配置し、テストするプライベートメソッドをパブリックメソッドとして公開します。
- テスト環境を使用して、テストコードと本番コードを別々に保ちながら、テストコードが本番コードのプライベートメソッドにアクセスできるようにします。
明らかに、3番目のオプションが最適です。
1)テストしたいクラスにテストを配置します(理想的ではありません)
テスト対象の製品コードと同じクラス/ソースファイルにテストケースを保存するのが最も簡単なオプションです。しかし、多くのプリプロセッサディレクティブや注釈がないと、テストコードが不必要に製品コードを肥大化させることになり、コードの構造に応じて、そのコードのユーザーに内部実装を誤って公開してしまう可能性があります。
2)テストするプライベートメソッドをパブリックメソッドとして公開します(実際にはお勧めできません)
これが非常に悪い習慣であることが示唆されているように、カプセル化を破壊し、コードのユーザーに内部実装を公開します。
3)より良いテスト環境を使用します(使用可能な場合は最適なオプション)
Eclipseの世界では、フラグメントを使用して3.を実現できます。C#の世界では、部分クラスを使用する場合があります。多くの場合、他の言語/環境にも同様の機能があります。見つける必要があるだけです。
1.または2.のみをオプションとして想定すると、テストコードや、汚いリネンを公共の場で洗い流す厄介なクラスインターフェースで本番ソフトウェアが肥大化する可能性があります。* 8 ')
- 全体として-プライベート実装に対してテストしない方がはるかに優れています。