2

新しい MVC4 アプリケーションを TDD できるように、DI、IoC、MOQ について学んでいます。

オンラインで多くの例をたどりましたが、手に負えないことが1つあります。

私のアプリケーションは 3 つのレイヤー (物理プロジェクト) で構成されています。

  1. アプリケーション層 (コントローラー/モデル/標準 MVC4 のもの)。
  2. ビジネス層 (すべての計算とデータ処理を行います)。
  3. ダル (EF5)。

今、私は非常に単純ですUserController

public class UserController : Controller
{
    readonly IUserRepository _repository;

    public UserController(IUserRepository rep)
    {
        _repository = rep;
    }

    public ActionResult Index()
    {
        IList<User> users = _repository.Get(10);
        return View(users);
    }

依存関係は Unity で注入され、これは正常に機能します。

ビジネス層にはリポジトリがあります:

public interface IUserRepository
{
    IList<User> Get(Int32 count);
}

public class UserRepository : IUserRepository
{
    public IList<User> Get(Int32 count)
    {
        // Here I fetch the data from the Database
        // and do some stuff with it, this can be
        // quite a big method.
    }
}

UserRepositoryここで、 Get メソッドで実行できる DAL にアクセスする必要があります。

これを単体テストするにはどうすればよいですか?テスト容易性のために、クラスに依存関係があるべきではないと思います。

単体テストで実際のUserRepositoryクラスを使用してテストすると、DAL に移動してそこからのデータが使用されますが、モック データが必要です。

IUserDataRepository実際のデータがデータベースからフェッチされ、これをコンストラクターに渡す別の場所を作成する必要がありますか、UserRepositoryそれとも Unity を使用してこれを処理する必要がありますか?

可能な答え?

という新しいインターフェースを作成しましたUsers

public class Users: IUsers
{
    private readonly IUserRepository _userRepository;
    public Users(IUserRepository userRepository)
    {
        _userRepository = userRepository;
    }

    public User Get(String id)
    {
       // Do all the magic here here
    }
}

このインターフェイスからIUsers:

public interface IUsers
{
    User Get(String id);
}

しかし、データベース指向のリポジトリを DAL に移動しました。

public class UserRepository : IUserRepository
{ 
    public User Get(String id)
    {
        // Retrieve the user from the database with EF5
    }
}

public interface IUserRepository
{
    User Get(String id);
}

コントローラーはほぼ同じままでしたが、現在は IUser インターフェイスに依存しています。

public class UserController : Controller
{
    readonly IUsers _users;

    public UserController(IUsers users)
    {
        _users = users;
    }

    public ActionResult Index()
    {
        User user = _users.Get(10);
        return View(users);
    }
}
4

3 に答える 3

3

リポジトリはデータベースへのゲートウェイです。それらには可能な限り最小限のコードが含まれており(ビジネス関連のものは含まれていません)、データベースからデータを取得する(またはデータベースに保存する)ために必要なことだけを行います。

データベースに直接結合されているため、単体テストはできません。そのロジックを抽象化する場合にのみ単体テストを実行できますが、それはまさにリポジトリの目的であるため、役に立たない抽象化です。

代わりに、データベース トランザクションを設定し、実際のリポジトリを呼び出し、完了したらそのトランザクションをロールバックする統合テストを作成します。

于 2012-10-20T15:22:54.543 に答える
0

適切なデータを返すモック IUserRepository を作成しますが、正直なところ、EF4 以降の基になるデータを簡単にモックアウトできるため、必要に応じてコントローラーで EF クエリを直接テストできます。EF4 では、ObjectSet を IObjectSet を実装した偽の ObjectSet に置き換えます。EF5 では、DbSet でも同じことができると確信しています。

于 2012-10-20T21:14:34.687 に答える