【发布时间】:2010-11-05 17:29:55
【问题描述】:
在构建我最新的 ASP.NET MVC 项目时,我开始涉足单元测试、依赖注入和所有爵士乐。
我现在想要对我的控制器进行单元测试,但我很难弄清楚如何在没有 IoC 容器的情况下适当地做到这一点。
以一个简单的控制器为例:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
因为它直接实例化了 SqlQuestionsRepository,所以这个类不是很容易进行单元测试。所以,让我们沿着依赖注入路线走下去:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
这似乎更好。我现在可以使用模拟 IQuestionsRepository 轻松编写单元测试。但是,现在要实例化控制器的是什么?在调用链更上层的某个地方 SqlQuestionRepository 将不得不被实例化。似乎我只是将问题转移到别处,并没有摆脱它。
现在,我知道这是一个很好的例子,说明 IoC 容器可以通过为我连接控制器依赖项来帮助您,同时使我的控制器易于进行单元测试。
我的问题是,如何在没有 IoC 容器的情况下对这种性质的事物进行单元测试?
注意:我并不反对 IoC 容器,而且我很可能很快就会走上这条路。但是,我很好奇不使用它们的人有什么替代方案。
【问题讨论】:
标签: asp.net-mvc unit-testing inversion-of-control controller ioc-container