我一直在使用“穷人”依赖注入技术对控制器进行单元测试。每个控制器都从一个基本控制器继承,以查询母版页的数据。如何在不触及数据库的情况下继承基本控制器对控制器进行单元测试?
public class HomeController : BaseController
{
IUserRepository _userRepository;
public HomeController() : this(new UserRepository()) {
}
public HomeController(IUserRepository userRepository) {
_userRepository = userRepository;
}
}
public class BaseController : Controller
{
protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
MyDataContext db = new MyDataContext();
ViewData["masterPageData"] = db.GetSomeData();
base.Execute(requestContext);
}
}
答案 0 :(得分:1)
代码看起来像这样:
public class HomeController : BaseController
{
IUserRepository _userRepository;
public HomeController() : this(new UserRepository()) { }
public HomeController(IUserRepository userRepository) : base() {
_userRepository = userRepository;
}
public HomeController(IUserRepository userRepository, ISomeRepository someRepository) : base(someRepository) {
_userRepository = userRepository;
}
}
public class BaseController : Controller
{
ISomeRepository _someRepository;
public BaseController(ISomeRepository someRepository)
{
_someRepository = someRepository;
}
public BaseController()
{
_someRepository = new SomeRepository();
}
protected override void Execute(System.Web.Routing.RequestContext requestContext)
{
MyDataContext db = new MyDataContext();
ViewData["masterPageData"] = _someRepository.GetSomeData();
base.Execute(requestContext);
}
}
也就是说,如果使用DI框架,每个类只需要1个构造函数。所以你可以看到它如何开始倾向于使用一个:)。
答案 1 :(得分:0)
可能是在你的datacontext上有一个接口并注入了你的datacontext然后实现了一个模拟接口,它会返回你的数据而不会访问数据库
答案 2 :(得分:0)
我会说问题是您的基本控制器使用不同的数据访问方法。更重要的是,BaseController与DataContext硬连接,导致可测试性问题。
如果BaseController需要从数据库中获取数据,为什么不在其中使用存储库呢?如果完整的IoC容器不可用,您可以在继承的控制器中注入存储库依赖项并将其传递给BaseController。
通过这种方式,可以轻松地为母版页数据创建模拟。