HttpContextWrapper - все это … полезный?

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

По причинам не особенно germaine к этому разговору, когда это пришло к контакту с использованием HttpContext, мы решили использовать недавно созданный класс HttpContextWrapper вместо того, чтобы изобрести что-то собственной разработки. Одной вещью, которую мы действительно представляли, была способность загрузить HttpContextWrapper (как, говорят, для поблочного тестирования). Это было полностью вдохновлено способом, которым Oren Eini обрабатывает поблочное тестирование с DateTimes (см. статью, шаблон, который мы также используем),

public static class FooHttpContext
{
    public static Func Current = () 
         => new HttpContextWrapper(HttpContext.Current);

    public static void Reset()
    {
        Current = () => new HttpContextWrapper(HttpContext.Current);
    }
}

Ничто особенно необычное. И это работает просто великолепно в нашем коде контроллера. Строка над заголовком приехала, когда мы идем для записи модульных тестов. Мы используем Moq в качестве нашей платформы насмешки, но увы

var context = new Mock() 

повреждения начиная с HttpContextWrapper не имеют ctor без параметров. И что это берет в качестве ctor параметра? Объект HttpContext. Таким образом, я оказываюсь в выгоде 22.

Я использую предписанный способ отделить HttpContext - но я не могу дразнить значение в том, потому что исходный объект HttpContext был изолирован и поэтому трудный протестировать. Я могу отобразить HttpContextBase, который оба получают из - но это действительно не получает меня, что я после. Я просто упускаю суть где-нибудь относительно HttpContextWrapper?

Редактирование для разъяснения намерения

Мы нашли способы решить проблему - но я предполагаю окончательный вопрос, с которым мы уходим, то, что оценивает HttpContextWrapper, приносит к таблице? Я не сомневаюсь где-нибудь, что у кого-то полностью была a-ha! момент с ним, но он просто не прибывает ко мне. Большинство регистраций, которые я вижу здесь, обсуждает это с точки зрения тестируемости - но мой собственный опыт привел меня полагать, что это не принесло много в том контексте. Если мы не делаем его неправильно. (Совершенно возможный).

26
задан Nick Craver 7 August 2010 в 10:48
поделиться

1 ответ

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

public static Func<HttpContextBase> Current = 
    () => new HttpContextWrapper(HttpContext.Current);

И в вашем модульном тесте:

SomeClass.Current = MockHttpContextBase(); // Sorry I don't know the syntax for Moq
34
ответ дан 28 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: