新しい MVC4 アプリケーションを TDD できるように、DI、IoC、MOQ について学んでいます。
オンラインで多くの例をたどりましたが、手に負えないことが1つあります。
私のアプリケーションは 3 つのレイヤー (物理プロジェクト) で構成されています。
- アプリケーション層 (コントローラー/モデル/標準 MVC4 のもの)。
- ビジネス層 (すべての計算とデータ処理を行います)。
- ダル (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);
}
}