Moq: поблочное тестирование доверие метода HttpContext

Походит на cpan модуль Devel:: Цикл - то, что Вы ищете. Это требует внесения некоторых изменений в Ваш код, но это должно помочь Вам найти свои ссылки без слишком многих проблем.

38
задан p.campbell 31 July 2009 в 20:13
поделиться

3 ответа

Webforms, как известно, невозможно тестировать именно по этой причине - большая часть кода может полагаться на статические классы в конвейере asp.net.

Чтобы проверить это с помощью Moq, вам необходимо провести рефакторинг ваш метод GetSecurityContextUserName () для использования внедрения зависимостей с объектом HttpContextBase .

HttpContextWrapper находится в System.Web.Abstractions, который поставляется с .Net 3.5. Это оболочка для класса HttpContext и расширяет HttpContextBase , и вы можете создать HttpContextWrapper следующим образом:

var wrapper = new HttpContextWrapper(HttpContext.Current);

Еще лучше, вы можете высмеивать HttpContextBase и настройте на него свои ожидания с помощью Moq. Включая вошедшего в систему пользователя и т. Д.

var mockContext = new Mock<HttpContextBase>();

С учетом этого, вы можете вызвать GetSecurityContextUserName (mockContext.Object) , и ваше приложение гораздо менее связано со статическим HttpContext WebForms. Если вы собираетесь проводить множество тестов, основанных на фиктивном контексте, я настоятельно рекомендую взглянуть на класс MvcMockHelpers Скотта Хансельмана , у которого есть версия для использования с Moq. Он удобно выполняет большую часть необходимых настроек. И, несмотря на название, вам не нужно делать это с помощью MVC - я успешно использую его с приложениями веб-форм, когда я могу реорганизовать их для использования HttpContextBase .

s Класс MvcMockHelpers , у которого есть версия для использования с Moq. Он удобно выполняет большую часть необходимых настроек. И, несмотря на название, вам не нужно делать это с помощью MVC - я успешно использую его с приложениями веб-форм, когда я могу реорганизовать их для использования HttpContextBase .

s Класс MvcMockHelpers , у которого есть версия для использования с Moq. Он удобно выполняет большую часть необходимых настроек. И, несмотря на название, вам не нужно делать это с помощью MVC - я успешно использую его с приложениями веб-форм, когда я могу реорганизовать их для использования HttpContextBase .

43
ответ дан 27 November 2019 в 03:50
поделиться

На самом деле это не связано с использованием Moq для модульного тестирования того, что вам нужно.

Обычно мы на работе используем многоуровневую архитектуру, где код на уровне представления действительно только для организации вещи для отображения в пользовательском интерфейсе. Такой код не охвачен модульными тестами. Вся остальная логика находится на бизнес-уровне, который не обязательно должен иметь какую-либо зависимость от уровня представления (т.е. ссылки на конкретные пользовательские интерфейсы, такие как HttpContext), поскольку пользовательский интерфейс также может быть приложением WinForms, а не обязательно веб-приложением. .

Таким образом вы можете избежать возиться с фреймворками Mock, пытаясь имитировать HttpRequests и т. Д., Хотя часто это может быть необходимо.

0
ответ дан 27 November 2019 в 03:50
поделиться

Вы используете Vista или Windows 7? Если это так, то SetThreadLocale не работает (даже если он возвращает TRUE, вздох), и вам нужно использовать SetThreadUILanguage .

Я только что завершил приложение WTL, которое было переведено на 7 разных языков, и пользователь может переключать языки без проблем, которые вы описываете. Я использую SetThreadLocale в XP и SetThreadUILanguage в Vista / 7.

Дополнительная информация:

http://social.msdn.microsoft.com/forums/en- США / windowscompatibility / thread / d3a44b1c-900c-4c64-bdf8-fe94e46722e2 /

http: //www.curlybrace. и используйте их при получении или настройке принципала. Это позволяет вам получить / установить принципала везде, где это необходимо (обычно в HttpContext в Интернете, и в текущем потоке в другом месте, например, в модульных тестах). Это будет выглядеть примерно так:

public static IPrincipal GetCurrentPrincipal()
{
    return HttpContext.Current != null ?
        HttpContext.Current.User :
        Thread.CurrentThread.Principal;
}

public static void SetCurrentPrincipal(IPrincipal principal)
{
     if (HttpContext.Current != null) HttpContext.Current.User = principal'
     Thread.CurrentThread.Principal = principal;
}

Если вы используете настраиваемый принципал, то их можно довольно хорошо интегрировать в его интерфейс, например, ниже Current вызовет GetCurrentPrincipal и SetAsCurrent вызовет SetCurrentPrincipal .

public class MyCustomPrincipal : IPrincipal
{
    public MyCustomPrincipal Current { get; }
    public bool HasCurrent { get; }
    public void SetAsCurrent();
}
0
ответ дан 27 November 2019 в 03:50
поделиться
Другие вопросы по тегам:

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