数か月間 TDD を使用してきましたが、今はコントローラー (MVC) をテストする方法を学びたいと思っています。
単体テストは、各機能の最小単位をテストすることによって行われます。コントローラーが小さくない場合もあります。モデルからデータを取得し、ビューに渡します。
コントローラーの単体テストはどのようにすればよいですか? コントローラーの依存関係をモックする必要がありますか?
コントローラーのテストは統合テストと見なされますか?
ありがとうございました。
数か月間 TDD を使用してきましたが、今はコントローラー (MVC) をテストする方法を学びたいと思っています。
単体テストは、各機能の最小単位をテストすることによって行われます。コントローラーが小さくない場合もあります。モデルからデータを取得し、ビューに渡します。
コントローラーの単体テストはどのようにすればよいですか? コントローラーの依存関係をモックする必要がありますか?
コントローラーのテストは統合テストと見なされますか?
ありがとうございました。
私はかなり長い間TDDをやっています。私は、ASP.NET MVC を使用して TDD を 1 年以上行っています。
「単体テストのないコード行はありません」という標準的なルールから始めたので、コントローラーを含むすべてをテストしました。コントローラーをテストする必要があります。これは、MVC フレームワークの目標の 1 つでした。これらのものをテスト可能にすることです。
アプローチする小さなアプリケーションの場合、非常にうまく機能します。ほとんどすべてのロジックはコントローラー内に配置され、すべてが非常にうまくテストされています。
しかし、MVC を使い続けている限り、考えが変わり始めました。コントローラーはできるだけスリムに保つようにしています。理想的には、何らかのビジネス オブジェクトへの呼び出しを委任し、結果をラップするだけです。残りはフィルターによるものです。
それは私にとってもうまくいきました!私は今、個別に実装/テストされたビジネスオブジェクトを持っているので、コントローラーは単なる統合ポイントです。積分点が小さすぎるため、積分点をテストする理由はありません。
統合テストについて: 実際にそれが必要な状況にまだ会っていません。コントローラーは常に、コンストラクターによって注入される抽象化に依存することを忘れないでください。これらの抽象化がどのように機能するかについて「適切な」仮定がある限り、適切な単体テストを作成できます。失敗したので、単体テストを修正するだけです。
統合テストは重要で便利ですが、できるだけ少なく作成するようにしています。
私はアレクサンダー B と同じようにコントローラーにアプローチしています。私のコントローラーは薄くて馬鹿です。ただし、ビジネス オブジェクトまたはサービス オブジェクトを正しく呼び出し、正しいパラメーターを渡していることを確認するためのテストを作成しています。
これはおそらく、先週ようやく見つけた実際のバグによって最もよく説明されています。マネージャーがユーザーからのリクエストを承認または拒否できるようにするコントローラーがあります。これには、未処理のリクエストのリスト ビューと各リクエストの詳細ビューの 2 つのビューがあります。どちらのビューも承認または拒否できます。コントローラーが呼び出すサービスには、リクエストのステータスを変更するためのメソッドを含む、他の公開されたメソッドがたくさんあります...これがどこに向かっているのかを見ることができます。リスト ビューはワークフローを承認または拒否してトリガーするための正しいメソッドを呼び出し、詳細ビューは状態変更メソッドのみを呼び出し、それ以上のワークフローを開始しませんでした。これは私のコーディングの間違いでしたが、私の人生では、長い間それを見ることができませんでした.ワークフローはバックグラウンドスレッドで実行され、そのセクションのエラーであると仮定して、それらのスレッドを 1 週間かけて実行しました.
だから私にとって
等
同じ質問が昨日尋ねられました:
そして私の意見では、はい、コントローラーをテストすることは理にかなっています。あなたはできる:
コントローラーの単体テストを開発するための自然な方法は、コントローラーが依存するインターフェース (コントローラーが制御する「もの」、それらをIControllable
s と呼びましょう) をモックすることです。次に、コントローラーが制御対象のオブジェクトを期待どおりに操作することを確認できます。
コントローラーと制御対象オブジェクト間の相互作用が複雑な場合は、専用の統合テストが有効な場合があります。たとえば、一連のクラスが実装されている場合があります。IControllable
これらの実装のそれぞれは、コントローラーとうまく連携しますか? おそらく、複数の異なるものIControllables
が相互作用します(同じリソースを使用します)?それとも、IControllables
動作に影響を与えるように構成するためのトリッキーな方法があるのでしょうか? これをテストする方法は、一連の疑わしいIControllable
実装またはそれらの組み合わせをポンピングする再利用可能なテスト スイートを作成することです。
最後になりましたが、TDD は受け入れテストにも関係しています。したがって、TDD を実行すると、エンド ユーザーが認識できるシナリオを実行するための高レベルのエンド ツー エンド テストも行われます。ほとんどの場合、これらはコントローラーも実行します。そのようにして、コントローラーと (特定の) クラスとの間の適切な統合もテストします。