現在、ASP.Net MVCアプリケーションの基礎を設定しています。どのような単体テストを作成する必要があるのかを検討しています。私は複数の場所で人々が本質的に「あなたの意見をテストすることを気にしないでください、ロジックはなく、簡単で、統合テストでカバーされます」と言ってきました。
これがどのように受け入れられた知恵になったのか理解できません。統合テストは、単体テストとはまったく異なる目的を果たします。何かが壊れた場合、統合テストが壊れた30分後に知りたくないので、すぐに知りたいです。
サンプルシナリオ: Customerエンティティを持つ標準のCRUDアプリを扱っているとしましょう。顧客には名前と住所があります。テストの各レベルで、顧客の取得ロジックが名前と住所の両方を適切に取得することを確認します。
リポジトリを単体テストするために、データベースにアクセスする統合テストを作成します。ビジネスルールを単体テストするために、リポジトリをモックアウトし、ビジネスルールに適切なデータをフィードし、期待される結果が返されることを確認します。
やりたいこと: UIの単体テストを行うには、ビジネスルールをモックアウトし、予想される顧客インスタンスをセットアップし、ビューをレンダリングし、指定したインスタンスの適切な値がビューに含まれていることを確認します。
立ち往生していること: リポジトリの単体テストを行うには、統合テストを作成し、適切なログインを設定し、データベースに必要なデータを作成し、ブラウザーを開いて顧客に移動し、結果のページに適切なものが含まれていることを確認します指定したインスタンスの値。
上記の2つのシナリオにはオーバーラップがありますが、テストのセットアップと実行に必要な時間と労力の主な違いは理解しています。
私(または別の開発者)がアドレスフィールドをビューから削除した場合、統合テストがこれを検出するのを待ちたくありません。私が欲しいのは、毎日複数回行われるユニットテストで発見され、フラグが立てられます。
重要な概念を把握していないように感じます。MVCビューの有効性に関するテストのフィードバックをすぐに望むのはなぜ悪いのか、誰かが説明できますか?(または、悪くない場合は、フィードバックを得るための予想される方法ではありません)
"To unit-test the repository, I write an integration test"
待って…何?これは、リポジトリの単体テストではありません。テストを自動化していますが、テスト対象のコードにはまだDALとデータベースが含まれています。リポジトリを単体テストするには、ビジネスルールと同じようにリポジトリを分離します。