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

@CodingTheWheel:

существует одна небольшая проблема с Вашим подходом. Считайте вызов таким как

XTRACE("x=%d", x);

, Это хорошо работает в отладочной сборке, но в сборке конечных версий он расширится до:

("x=%d", x);

то, Которое является совершенно законным C и скомпилирует и обычно работать без побочных эффектов, но генерирует ненужный код. Подход, который я обычно использую для устранения той проблемы:

  1. Заставляют функцию XTrace возвратиться, интервал (просто возвращаются 0, возвращаемое значение не имеет значения)

  2. Изменение #define в #else пункте к:

    0 && XTrace
    

Теперь версия выпуска расширится до:

0 && XTrace("x=%d", x);

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

, Конечно, так же, как я записал, что последнее предложение, понял, что, возможно, исходная форма могла бы быть оптимизирована далеко также и в случае побочных эффектов, таких как вызовы функции, передал как параметры XTrace, это могло бы быть лучшее решение, так как это удостоверится, что отладочные версии и версии выпуска будут вести себя то же.

10
задан Cœur 2 April 2017 в 15:21
поделиться

2 ответа

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

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

6
ответ дан 4 December 2019 в 02:50
поделиться

Для тестирования я использую 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();

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

1
ответ дан 4 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

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