在构建我最新的 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 容器,而且我可能很快就会走上这条路。但是,我很好奇不使用它们的人有什么替代方案。