間違いなく良いリストです。ここにいくつかの考えがあります:
最初にテストを書き、次にコードを書きます。
高いレベルで同意します。しかし、もっと具体的に言えば、「最初にテストを書き、次にテストに合格するだけのコードを書き、それを繰り返す」ということです。そうしないと、単体テストが統合テストや受け入れテストのようになってしまうのではないかと心配しています。
依存性注入を使用してクラスを設計します。
同意した。オブジェクトが独自の依存関係を作成する場合、それらを制御することはできません。制御の反転 / 依存性注入によってその制御が可能になり、モック/スタブなどを使用してテスト対象のオブジェクトを分離できます。これは、オブジェクトを分離してテストする方法です。
Model-View-Controller または Model-View-Presenter を使用して、UI コードをその動作から分離します。
同意した。プレゼンター/コントローラーでさえ、DI/IoC を使用して、スタブ/モック ビューとモデルを渡すことでテストできることに注意してください。詳細については、 Presenter First TDD をご覧ください。
静的メソッドまたはクラスを作成しないでください。
私がこれに同意するかどうかはわかりません。モックを使用せずに静的メソッド/クラスを単体テストすることは可能です。したがって、おそらくこれは、あなたが言及した Rhino Mock 固有のルールの 1 つです。
クラスではなく、インターフェイスからプログラムします。
同意しますが、少し異なる理由があります。インターフェイスは、さまざまなモック オブジェクト フレームワークをサポートするだけでなく、ソフトウェア開発者に大きな柔軟性を提供します。たとえば、インターフェイスがなければ DI を適切にサポートすることはできません。
外部依存関係を分離します。
同意した。インターフェイスを使用して、独自のファサードまたはアダプター (必要に応じて) の背後にある外部依存関係を非表示にします。これにより、Web サービス、キュー、データベースなどの外部依存関係からソフトウェアを分離できます。これは、チームが依存関係 (外部) を制御していない場合に特に重要です。
モックするメソッドを仮想としてマークします。
これは Rhino モックの制限です。モック オブジェクト フレームワークよりもハンド コーディングされたスタブを好む環境では、その必要はありません。
そして、考慮すべき新しい点がいくつかあります。
創造的なデザイン パターンを使用します。これは DI に役立ちますが、そのコードを分離して、他のロジックとは別にテストすることもできます。
Bill Wake の Arrange/Act/Assert 手法を使用してテストを記述します。この手法により、必要な構成、実際にテストされているもの、および期待されるものが非常に明確になります。
独自のモック/スタブを作成することを恐れないでください。多くの場合、モック オブジェクト フレームワークを使用すると、テストが非常に読みにくくなります。独自のロールを作成することで、モック/スタブを完全に制御できるようになり、テストを読みやすく保つことができます。(前のポイントに戻って参照してください。)
単体テストから重複をリファクタリングして抽象基本クラス、またはセットアップ/ティアダウン メソッドにする誘惑を避けてください。そうすることで、単体テストを理解しようとする開発者から構成/クリーンアップ コードを隠すことができます。この場合、個々のテストを明確にすることは、重複をリファクタリングすることよりも重要です。
継続的インテグレーションを実装します。すべての「緑色のバー」でコードをチェックインします。ソフトウェアを構築し、すべてのチェックインでユニット テストの完全なスイートを実行します。(もちろん、これ自体はコーディングの実践ではありませんが、ソフトウェアをクリーンで完全に統合した状態に保つための素晴らしいツールです。)