@CodingTheWheel:
существует одна небольшая проблема с Вашим подходом. Считайте вызов таким как
XTRACE("x=%d", x);
, Это хорошо работает в отладочной сборке, но в сборке конечных версий он расширится до:
("x=%d", x);
то, Которое является совершенно законным C и скомпилирует и обычно работать без побочных эффектов, но генерирует ненужный код. Подход, который я обычно использую для устранения той проблемы:
Заставляют функцию XTrace возвратиться, интервал (просто возвращаются 0, возвращаемое значение не имеет значения)
Изменение #define в #else пункте к:
0 && XTrace
Теперь версия выпуска расширится до:
0 && XTrace("x=%d", x);
и любой достойный оптимизатор выбросит все это, так как оценка короткого замыкания предотвратила бы что-либо после & & от того, чтобы когда-нибудь быть выполняемым.
, Конечно, так же, как я записал, что последнее предложение, понял, что, возможно, исходная форма могла бы быть оптимизирована далеко также и в случае побочных эффектов, таких как вызовы функции, передал как параметры XTrace, это могло бы быть лучшее решение, так как это удостоверится, что отладочные версии и версии выпуска будут вести себя то же.
Я склоняюсь к HttpContextBase. В основном потому, что я думаю, что это было изобретено именно по этой причине: возможность тестирования. И зачем изобретать велосипед, если приемлемое решение уже существует.
Если вы приложите много усилий к классам-оболочкам вокруг HttpContext, вы получите нечто очень похожее на HttpContextBase ...
Для тестирования я использую 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();
Для других объектов я тоже иногда использую подделки.