Поскольку я хочу смоделировать HttpContext, а не HttpContextBase, я попытался найти способ конвертировать фиктивный объект HttpContextBase в HttpContext и обнаружил, что это невозможно.
HttpContext
Это винтажный контекст asp.net. Проблема в том, что это
не имеет базового класса и не является виртуальным, и, следовательно, непригодным для тестирования
(не могу посмеяться над этим). Рекомендуется не передавать его как функцию
аргументы, вместо этого передайте переменные типа HttpContextBase.
HttpContextBase
Это (новинка для c # 3.5) замена HttpContext. Так как это
абстрактно, теперь это насмешливо. Идея в том, что ваши функции, которые
ожидать, что будет передан контекст должен ожидать получить один из них.
Это конкретно реализовано HttpContextWrapper
HttpContextWrapper
Также новый в C # 3.5 - это конкретная реализация
HttpContextBase. Чтобы создать один из них на обычной веб-странице, используйте новый
HttpContextWrapper (HttpContext.Current).
Идея состоит в том, что для того, чтобы сделать ваш код модульно-тестируемым, вы объявляете все свои
переменные и параметры функции должны быть типа HttpContextBase, и
используйте каркас МОК, например, замок Виндзор, чтобы ввести его. В норме
код, замок должен ввести эквивалент «нового
HttpContextWrapper (HttpContext.Current) ', тогда как в тестовом коде вы
чтобы получить макет HttpContextBase.
(источник: http://www.splinter.com.au/httpcontext-vs-httpcontextbase-vs-httpcontext/)
Поэтому я изменил способ вызова своего кода.
от использования HttpContext
:
public static string GetIpAddress(HttpContext currentContext) {
...
}
Для использования HttpContextBase
:
public static string GetIpAddress(HttpContextBase currentContext) {
...
}
И когда я использую метод, я обертываю HttpContext с HttpContextWrapper примерно так:
var ip = GeneralUtil.GetIpAddress(new HttpContextWrapper(HttpContext.Current));
Теперь вы можете легко высмеивать HttpContextBase , следуя ответу Дана Аткинсона