Я начинаю изучать юнит-тестирование, Dependancy Injection и все такое прочее при создании моего последнего проекта ASP.NET MVC.
Я сейчас нахожусь в точке, где я хотел бы провести модульное тестирование своих контроллеров, и мне трудно понять, как правильно сделать это без контейнера IoC.
Возьмем, к примеру, простой контроллер:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository = new SqlQuestionsRepository();
// ... Continue with various controller actions
}
Этот класс не очень хорошо тестируется модулем из-за его прямого создания SqlQuestionsRepository. Итак, давайте пойдем по маршруту Depenancy Injection и сделаем:
public class QuestionsController : ControllerBase
{
private IQuestionsRepository _repository;
public QuestionsController(IQuestionsRepository repository)
{
_repository = repository;
}
}
Это кажется лучше. Теперь я могу легко написать модульные тесты с помощью фиктивного IQuestionsRepository. Однако, что собирается создать экземпляр контроллера сейчас? Где-то дальше вверх по цепочке вызовов будет создан экземпляр SqlQuestionRepository. Кажется, что я просто перенес проблему в другое место, а не избавился от нее.
Теперь я знаю, что это хороший пример того, как контейнер IoC может помочь вам, подключив для меня зависимости от контроллеров, и в то же время поддерживая простоту тестирования моего контроллера.
У меня вопрос: как можно провести модульное тестирование вещей такого типа без контейнера IoC?
Примечание: я не против контейнеров IoC и, скорее всего, скоро пойду по этому пути. Однако мне любопытно, какова альтернатива для людей, которые их не используют.