我正在学习 DI、IoC 和 MOQ,所以我可以 TDD 我的新 MVC4 应用程序。
我在网上关注了很多示例,但有一件事我无法掌握。
我的应用程序由 3 层(物理项目)组成:
- 应用层(控制器/模型/标准 MVC4 东西)。
- 业务层(做所有的计算和处理数据)。
- DAL (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);
}
}