我正在构建最新的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容器,并且很快就会采用它们。 但是,我想知道不使用它们的人的替代方法。