2012-04-10 8 views
7

私はコントローラの一部をユニットテストできる方法があるかと思います。 リポジトリパターンを使用しないMVC。私はASP.NET MVCサイトを開発しましたが、初期段階で単体テストを行わずにこれを行いました。今私はコントローラで2つ以上のアクションがあるかもしれないということを使って、私の家庭教師に何らかの単体テストをデモンストレーションしたいと思います。私のアクションロジックのほとんどはデータベースからデータを取得し、1つのコントローラは異なるテーブルからデータを取得します。 Generic Repositoryパターンを使ってテストできると思います。私は初心者として、データベースから来ていないコードを単体テストでテストできることを知ったが、残念なことにコントローラのアクションのコードのほとんどはデータベースから来ている。私はVisual Studioでデフォルトのテストツールを使用しており、EFのコードは自分のデータベースの最初のアプローチです。
たとえば、同じコントローラにある他のアクションをユニットテストすることなく、以下のアクションだけをユニットテストしたいと思います。レポジトリパターンを使用しないでASP.NET MVCコントローラをユニット化する方法

public ActionResult Index() 
    { 
     var model = _db.PhotoGallery; 
     return View(model); 
    } 

これは説明のためのものです。

答えて

6

定義により、単体テストは呼び出すメソッドにのみ影響を与える必要があります。実際にデータベースのラウンドトリップが発生していないように_dbオブジェクトをモックする方法を見つけることができれば、それに依存するこのメソッドを単体テストできます。そうでなければ、いいえ。

_dbフィールドのタイプはインターフェイスですか?それは注射によって提供されていますか?もしそうなら、あなたはこのメソッドを単体テストできます。

5

コントローラメソッド内のデータベースへの直接の依存関係を削除しないと、これらのメソッドを単体テストできなくなります。

これを行うには、MVCと組み合わせてIOCコンテナ(例:Ninject)を使用して、必要なデータをコントローラのコンストラクタに渡すことをお勧めします。その "データオブジェクト"はデータベースに結ばれてはいけません。通常、POCOオブジェクトであるか、インタフェースとして渡されます。

単体テストでは、単体テスト用に構築されたメモリ内データオブジェクト(通常はRhino MocksやMoqなど)を使用して、一般的に「模擬」された依存データを置き換えることができます。

このアプローチを使用すると、コントローラをユニットテスト可能にするだけでなく、非常に緩やかに結合されたコードで終了することになります。これは、後で開発するために恩恵を受ける可能性があります。

2

これはtestableというコードです:) ユニットテストを実行するときは、SUT(テスト対象システムまたはテスト対象クラス)の実装で、テストに失敗したという理由のみが変更されていることを確認する必要があります。もちろん、依存関係のAPIが変更されたときに破損する可能性があります(新しいAPIを使用するようにSUTを変更する必要があります)。ただし、依存関係の実装が変更されても失敗することはありません。それでなぜ嘲笑とスタブが使われたのですか?

ただし、依存関係を模擬したい場合は、SUT内に作成しないでください。それはSUT(コンストラクタ、パラメータ注入のプロパティ)に注入する必要があります。

だから、戻ってあなたのケースに:

  • あなたがテスト可能なクラスを持っているしたい場合、あなたは依存関係(デシベル)を注入する必要があり
  • 依存性は、あなたがリポジトリパターンを使用することを強制されない
  • を嘲笑する必要があります。あなたのdbクラスを模擬することができます、それだけを嘲笑。または、他のデータアクセスの抽象化を使用する
関連する問題