一般的なコードのテストは簡単ではありません。もしそうなら、私たちはずっと前にそれをやっていました、そして、過去10-15年だけでそれのそのような少しの取引をしませんでした。最大の困難の1つは、カプセル化を壊すことなく、まとまりがあり、十分にファクタリングされ、テスト可能なコードをテストする方法を常に決定することでした。BDDプリンシパルは、ほぼ完全に動作に焦点を当てていることを示唆しており、いくつかの点で、内部の詳細をそれほど大きく心配する必要はないことを示唆しているように見えますが、非常に隠された方法で「スタッフ」を行う多くのプライベートメソッド。テストの全体的な複雑さが増し、より一般的なレベルですべての可能な結果を処理できるためです。
モッキングはある程度役立ちますが、やはりかなり外部的に焦点が当てられています。依存性注入はまた、モックまたはテストダブルで非常にうまく機能しますが、これはまた、インターフェイスを介して、または非表示のままにすることを好むかもしれない直接のいずれかで要素を公開することを必要とする可能性があります-これは特にそうする場合に当てはまりますシステム内の特定のクラスについて、偏執的なレベルのセキュリティを確保します。
私にとっては、より簡単にテストできるようにクラスを設計するかどうかについて、審査員はまだ出ていません。これにより、レガシーコードを維持しながら新しいテストを提供する必要がある場合に問題が発生する可能性があります。システム内のすべてを完全にテストできるはずですが、クラスのプライベート内部を(間接的であっても)公開するという考えは好きではありません。
私にとって、解決策は常にかなり実用的なアプローチを取り、特定の状況に合わせて多くの手法を組み合わせることでした。多くの継承されたテストダブルを使用して、テストの内部プロパティと動作を公開します。クラスにアタッチできるものすべてをモックします。クラスのセキュリティを損なわない場合は、テストのために動作をオーバーライドまたは注入する手段を提供します。コードをテストする機能の改善に役立つ場合は、よりイベント駆動型のインターフェイスを提供することも検討します。
「テスト不可能な」コードを見つけた場合は、テストしやすくするためにリファクタリングできるかどうかを確認します。多くのプライベートコードが舞台裏で隠されている場合、多くの場合、新しいクラスが分割されるのを待っています。これらのクラスは内部で使用される場合がありますが、多くの場合、より少ないプライベートな動作で独立してテストできます。ただし、テストコードを組み込んだプロダクションコードを記述することは避けてください。「テストラグ」を作成するとif testing then ...
、テストの問題が完全に解体されておらず、完全に解決されていないことを示します。
Gerard MeszarosのxUnit Test Patternsの本を読むと役立つかもしれません。この本では、この種のすべてをここで説明するよりもはるかに詳細に扱っています。私はおそらく彼が提案するすべてのことをするわけではありませんが、扱いにくいテスト状況のいくつかを明確にするのに役立ちます。結局のところ、好みの設計を適用しながらテスト要件を満たせるようにしたいので、妥協する必要があるかもしれない場所をより適切に決定するために、すべてのオプションをよりよく理解するのに役立ちます。