Лучшие практики для HttpContext и проверяемых контроллеров в ASP.Net MVC

Update:

Основываясь на нескольких ответах, которые я получил, я просто хочу пояснить, что я хорошо знаю, как смеяться над HttpContext, используя насмешливую структуру. Мне больше интересно узнать, какие плюсы и минусы издевательского HttpContext сравниваются с использованием классов-оболочек вокруг HttpContext.


Я ищу мнения о том, как обращаться с HttpContext при создании тестируемых контроллеров в ASP.Net MVC. После прочтения на нем, кажется, есть две школы мысли - либо постройте HttpContextBase, либо используйте фальшивую фреймворк для создания необходимых заглушек/макетов для вашего модульного тестирования или сборки классов агностических оболочек в областях HttpContext, которые вы намереваетесь использовать.

Сейчас я склоняюсь к созданию HttpContextBase. Похоже, что это как более быстрый процесс разработки, так и более простой в обслуживании, поскольку вам не нужно тратить время на разработку и поддержку дополнительных классов-оболочек. Я вижу, как классы-оболочки могут быть полезными, поскольку они абстрагируют скрытую реализацию и сохраняют контекст контроллера отдельно от запроса, но я не уверен, что это стоит дополнительных накладных расходов для настройки и обслуживания.

Что вы считаете "за" и "против" между этими двумя подходами, и когда вы выбираете один за другим? Существуют ли определенные типы развития, которые поддаются одному из решений больше, чем другому?

Как кажется, это общая проблема, с которой приходится сталкиваться с большинством команд, которые тестируют модульное тестирование и использует ASP.Net MVC, как бы вы или вы справились с этой проблемой? Если вы решили эту проблему, как ваше решение работало и что бы вы поступили иначе?

Ответ 1

Я склоняюсь к HttpContextBase. В основном потому, что я думаю, что он был изобретен именно по этой причине: тестируемость. И зачем изобретать колесо, когда есть приемлемое решение уже там.

Если вы приложите много усилий в свои классы-оболочки вокруг HttpContext, вы получите что-то очень похожее на HttpContextBase...

Ответ 2

Для тестирования я использую Rhino.Mocks. Чтобы настроить HttpContext в контроллере, я просто издевался над ним. Поэтому моя тестируемая система (или sut) выглядит примерно так:

            Controller controllerBase = sut as Controller;

Затем я издеваюсь над контекстом контроллера и настраиваю контекст контекста контроллера, чтобы вернуть макет класса HttpContextBase (как я уже упоминал выше). Мой код выглядит примерно так:

controllerContext = AMockOf<ControllerContext>();

// Add the test HttpContextBase to the controller context
HttpContextBase httpContextBase = SetUpTestHttpContext();
WhenThe(controllerContext).IsAskedForIts(x =>x.HttpContext).Return(httpContextBase).Repeat.Any();

Для других объектов я иногда использую подделки.