7

リポジトリパターンを使用せずに、MVC でコントローラーアクションの一部を単体テストできる方法があるかどうか疑問に思っています。ASP.NET MVC サイトを開発しましたが、初期段階で単体テストを行わずにこれを行いました。ここで、コントローラーで2つ以上のアクションを使用して、チューターに単体テストを実演したいと思います。私のアクションロジックのほとんどはデータベースからデータを取得し、1つのコントローラーは異なるテーブルからデータを取得します。つまり、1つのコントローラーのアクションは異なるテーブルから読み取られます。Generic Repository パターンを使用してテストできると思います。初心者として、データベースから取得されていないコードのみを単体テストできることがわかりましたが、残念ながらコントローラーアクションのほとんどのコードはデータベースから取得されています。私はVisual Studioでデフォルトのテストツールを使用しており、データベースにはEFコードの最初のアプローチを使用しています。
たとえば、同じコントローラーにある他のアクションを単体テストせずに、以下のアクションのみを単体テストしたいと思います。

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

これはデモンストレーションのみを目的としています。

4

3 に答える 3

6

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

_dbフィールドの型はインターフェイスですか? 注射で提供されていますか?その場合、このメソッドを単体テストできる可能性があります。

于 2012-04-10T15:07:13.860 に答える
5

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

これを行う全体的な推奨方法は、必要なデータをコントローラーのコンストラクターに渡すことができる MVC と組み合わせてIOC コンテナー ( Ninjectなど) を使用することです。その「データ オブジェクト」は、データベースに結び付けてはなりません。通常は、単なる POCO オブジェクトであるか、インターフェイスとして渡されます。

単体テストでは、単体テスト用に構築されたメモリ内データ オブジェクトを使用して、これらの依存関係を置き換えることができます。通常は、モッキング フレームワーク (Rhino Mocks またはMoq など) を使用して「モック」されます。

このアプローチを使用すると、コントローラーを単体テスト可能にするだけでなく、コードが非常に疎結合になるため、後の開発で利益が得られる可能性があります。

于 2012-04-10T15:08:05.513 に答える
2

それがコードと呼ばれるものtestableです:)ユニットテストを実行するときは、テストが失敗する唯一の理由がSUT(テスト対象のシステム、またはテスト対象のクラス)の実装で変更されていることを確認する必要があります。もちろん、依存関係の API が変更されると壊れる可能性があります (それは問題ありません。新しい API を使用するように SUT を変更する必要があります) が、依存関係の実装が変更されても失敗することはありません。それが、モッキングとスタブが使用される理由です。

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

だから、あなたのケースに戻ります:

  • テスト可能なクラスが必要な場合は、依存関係 (db) を注入する必要があります。
  • 依存関係は嘲笑されるべきです
  • リポジトリパターンの使用を強制されていません。db クラスをモックできる場合は、モックするだけです。または、他のデータアクセス抽象化を使用します
于 2012-04-10T15:12:45.113 に答える