Я пытаюсь найти хороший способ очистить мои контроллеры, чтобы сделать их более тестируемыми, не полагаясь на постоянное соединение с базой данных. Я думал, что неплохо начал с абстрагирования контекста моего объекта с помощью IObjectContext. Это хорошо работает для контекста, но моя следующая проблема заключается в том, что у меня есть универсальный репозиторий , который я использую в ряде методов действия во всем проекте (см. Код ниже).
В дополнение к конструктору по умолчанию, мой контроллер состоит из перегрузки, которая принимает IObjectContext (простое внедрение зависимости). В моих модульных тестах я могу легко издеваться над IObjectContext. Моя проблема связана с моим общим хранилищем в различных методах действия. Я мог бы добавить несколько дополнительных перегрузок конструктора к контроллеру, но, боюсь, это очень быстро запутается. Однако, если не делать этого, я просто не смог придумать чистый способ улучшить тестируемость, чтобы мне не пришлось полагаться на соединение с базой данных.
Есть ли простое решение, которое я пропускаю?
/// <summary>
/// Initializes a new instance of the HomeController class
/// </summary>
public HomeController(IObjectContext context)
{
_context = context;
}
/// <summary>
/// GET: /home/index
/// </summary>
/// <returns>Renders the home page</returns>
public ActionResult Index()
{
List contacts;
HomeViewModel model;
using (IRepository<Contact> repository = new DataRepository<Contact>(_context))
{
contacts = new List(repository.GetAll());
}
model = new HomeViewModel(contacts);
return View(model);
}
Если мне нужно пойти по пути добавления дополнительных перегрузок конструктора, чтобы учесть мои проблемы, я подумал о добавлении ряда частных свойств (которые могли бы отложить создание репозиториев до тех пор, пока они не потребуются) в мои контроллеры для каждого из репозиториев что методы действия используют. Например:
private IRepository<Contact> _contactRepository;
private IRepository<Contact> ContactRepository
{
get
{
return _contactRepository ?? (_contactRepository = new DataRepository<Contact>());
}
}
В целях модульного тестирования я смог бы предварительно инициализировать репозитории, используя перегрузки конструктора.
Что вы думаете об этом? Я скучаю по чему-то более чистому, что должно быть очевидно?