17

私はTDDを数ヶ月使用していましたが、私はControllers(MVC)をテストする方法を学びたいと思います。コントローラ(MVC)をテストする必要がありますか?

ユニットテストは、各機能の最小単位をテストすることによって行われます。コントローラが小さくないことがあります。モデルからデータを取得し、ビューに渡します。

コントローラをユニットテストするにはどうすればよいですか?私はコントローラの依存関係をモックするべきですか?

コントローラテストは統合テストと見なされますか?

ありがとうございます。

答えて

2

同じ質問が昨日尋ねた:

Does it make sense to test controllers

そして、私の意見では - はい、それはコントローラをテストしても意味がありません。次のことができます。それらの後ろ

  • モックサービス、それだけで、コントローラ自体
  • 休暇サービスunmockedをテストし、同様に、私はかなり長い間、TDDをやってる
+0

サービスとは何を意味しますか? – user972959

17

を統合テストを行うことが容易であるので、 。私はASP.NET MVCでTDDを今年以上にやっています。

私は標準的なルール、「ユニットテストのないコード行はありません」から始めました。そのため、コントローラーを含めてすべてをテストしました。コントローラはテストする必要がありますが、これはMVCフレームワークの目標の1つです。

アプローチが小規模なアプリケーションの場合、実際にうまく機能します。ほぼすべてのロジックがコントローラ内部に配置されています。すべてが非常にうまくテストされています。

しかし、私がMVCを続けていれば、私は心を変え始めました。コントローラーはできるだけスリムにしています。理想的には、何らかのビジネスオブジェクトへの呼び出しを委譲し、結果をラップするものとしては何もありません。残りはフィルターによるものです。

それは私にとってもうまく機能しました!私は現在実装されている/個別にテストされているビジネスオブジェクトを持っているので、コントローラはちょうど統合ポイントです。それが小さいから統合ポイントをテストする理由はありません。

統合テストについて:私はまだ実際に必要な状況にはまだ合っていません。そのコントローラーは、常にコンストラクターによって挿入する抽象化に依存していることを忘れないでください。これらの抽象がどのように機能するかという「良い」仮定がある限り、適切な単体テストを作成します。あなたが失敗したので、単体テストを修正するだけです。

統合テストは重要で便利ですが、できるだけそれらを作成しようとします。

+0

最初にモデルのテストを書いていますか?統合テストはいつ書くのですか?あなたは例を挙げてもらえますか? – user972959

5

私はAlexander Bと同じ方法を採用しています。私のコントローラーは薄くてダムです。しかし、私はまだ彼らがビジネスオブジェクトやサービスオブジェクトを正しく呼び出し、正しいパラメータを渡していることを確認するためのテストを書いています。

これはおそらく私が最後に最後に捉えた実際のバグによって最もよく説明されています。管理者がユーザーからの要求を承認または拒否できるコントローラがあり、未解決要求のリストビューと各要求の詳細ビューの2つのビューがあります。どちらのビューも承認または拒否できます。コントローラが呼び出すサービスには、リクエストのステータスを変更するためのものを含む、他の公開されたメソッドが多数含まれています...これがどこにあるかを見ることができます。リストビューはワークフローを承認または拒否してトリガーする正しいメソッドを呼び出し、詳細ビューは変更ステータスメソッドのみと呼ばれ、それ以上のワークフローを開始しませんでした。これは私のコーディングミスでしたが、私の人生の間、私はそれを見ることができませんでした。ワークフローはバックグラウンドスレッドで実行されていました。

だから、私のため

  • は、できるだけ早くお使いのコントローラが別の場所にデータを渡すように、テストを必要とします。
  • お使いのコントローラをチェックモデルの妥当性であれば、それは( 誰かがチェックを削除した場合どのような?)のテストを必要と

など

+0

パリに来るのはそんなに愚かではない... – Elisabeth

2

お使いのコントローラのユニットテストを開発するために、自然な方法はにありますコントローラーが依存しているインターフェイスをモックします(コントロールするもの、IControllableと呼ぶ)。次に、コントローラが制御されたオブジェクトを予想通りに操作することを確認できます。

コントローラーと制御対象間のやりとりが複雑な場合は、の統合テストが有効です。たとえば、IControllableを実装する一連のクラスがあります。これらの実装のそれぞれは、コントローラとうまく連携しますか?おそらく複数の異なるIControllablesが相互作用します(同じリソースを使用します)?あるいは、IControllablesは、それらの動作に影響を及ぼすような設定が難しい場合がありますか?これをテストする方法は、再利用可能なテストスイートを作成して、疑わしい範囲の実装またはその組み合わせをポップアップさせることです。

最後に、TDDは約アクセプタンステストです。したがって、TDDを実行する場合、エンドユーザーが認識するシナリオを実行するためのハイレベルのエンドツーエンドテストも行います。おそらく、これらはコントローラーと同様に、コントローラーと(特定の)クラス間の適切な統合をテストするためにもコントローラーを実行します。

関連する問題