Насмешливый HttpContext в MVC ** Снаружи ** от контроллера - PullRequest
2 голосов
/ 03 августа 2011

Сценарий

Мы разрабатываем новый веб-проект MVC и пытаемся придерживаться шаблона Skinny Controller, как описано в этой статье http://codebetter.com/iancooper/2008/12/03/the-fat-controller/

В рамках одного из наших действий мы получаем некоторые данные навигации (структура меню) из кэша.

Задача

Я приказываю поддерживать шаблон скинового контроллера, для которого мы хотели бы иметь вызов проверки кэша во ViewModel, который мы пробовали и, как мы знаем, работают, используя следующий код.

var cachedCategories = (List<Category>)HttpContext.Current.Cache["Categories"];
if (cachedCategories == null) {
       cachedCategories = _service.GetCategories().ToList<Category>();
       HttpContext.Current.Cache["Categories"] = cachedCategories;
}

Однако, когда дело доходит до модульного тестирования, мы сталкиваемся с проблемой. Так как мы не напрямую передаем HttpContext в ViewModel, мы не знаем, как насмехаться над HttpContext.

Мы используем Moq, и хотя у нас есть несколько опций (один - передать контекст от контроллера к модели представления при создании экземпляра), эти опции требуют изменения кода исключительно для обеспечения работы тестов.

У кого-нибудь есть предложения?

Ответы [ 2 ]

1 голос
/ 26 октября 2011

В конечном итоге мы решили изменить наш код, чтобы упростить тестирование.

Мы достигли этого путем передачи HttpContext в ViewModel при создании экземпляра, как я уже упоминал в моем первоначальном вопросе.

1 голос
/ 03 августа 2011

макет HttpContext - это огромная работа, так как это один из самых больших объектов, которые вы увидите за всю свою жизнь, поэтому, вероятно, лучше не издеваться над ним.* файл MvcMockHelps показывает, как это делается.

...