Я проходил процесс очистки кода нашего контроллера, чтобы сделать каждое действие тестируемым. Вообще говоря, это не было слишком сложно - там, где у нас есть возможность использовать фиксированный объект, такой как, например, FormsAuthentication, мы обычно вводим некоторую форму обертки в зависимости от ситуации и будем на нашем веселом пути.
По причинам, не особенно подходящим для этого разговора, когда речь шла об использовании HttpContext, мы решили использовать только что созданный класс HttpContextWrapper, а не изобретать что-то доморощенное. Одна вещь, которую мы представили, была возможность поменять местами в HttpContextWrapper (например, для модульного тестирования). Это было полностью вдохновлено тем, как Орен Эйни выполняет модульное тестирование с помощью DateTimes ( см. Статью , шаблон, который мы также используем)
public static class FooHttpContext
{
public static Func<HttpContextWrapper> Current = ()
=> new HttpContextWrapper(HttpContext.Current);
public static void Reset()
{
Current = () => new HttpContextWrapper(HttpContext.Current);
}
}
Ничего особенного. И это прекрасно работает в нашем коде контроллера. Кикер пришел, когда мы пошли писать модульные тесты. Мы используем Moq в качестве основы для насмешек, но увы
var context = new Mock<HttpContextWrapper>()
прерывается, так как HttpContextWrapper не имеет ctor без параметров. И что он принимает в качестве параметра ctor? Объект HttpContext. Так что я попадаю в ловушку 22.
Я использую предписанный способ для отделения HttpContext - но я не могу смоделировать значение, потому что исходный объект HttpContext был запечатан и, следовательно, его трудно проверить. Я могу сопоставить HttpContextBase, которые оба получены из - но это не дает мне того, что я хочу. Я просто что-то упускаю из-за HttpContextWrapper?
Изменить для уточнения намерения
Мы нашли способы решения проблемы - но я думаю, что главный вопрос, с которым мы уходим, - какое значение HttpContextWrapper приносит в таблицу? Я не сомневаюсь, что где-то у кого-то был а-ха! момент с ним, но он просто не приходит ко мне. Большинство публикаций, которые я вижу здесь, обсуждают это с точки зрения тестируемости - но мой собственный опыт заставил меня поверить, что это не принесло многого в этом контексте. Если мы не делаем это неправильно. (Вполне возможно).