Походит на cpan модуль Devel:: Цикл - то, что Вы ищете. Это требует внесения некоторых изменений в Ваш код, но это должно помочь Вам найти свои ссылки без слишком многих проблем.
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
.
HttpContextBase
. s Класс MvcMockHelpers , у которого есть версия для использования с Moq. Он удобно выполняет большую часть необходимых настроек. И, несмотря на название, вам не нужно делать это с помощью MVC - я успешно использую его с приложениями веб-форм, когда я могу реорганизовать их для использования HttpContextBase
. На самом деле это не связано с использованием Moq для модульного тестирования того, что вам нужно.
Обычно мы на работе используем многоуровневую архитектуру, где код на уровне представления действительно только для организации вещи для отображения в пользовательском интерфейсе. Такой код не охвачен модульными тестами. Вся остальная логика находится на бизнес-уровне, который не обязательно должен иметь какую-либо зависимость от уровня представления (т.е. ссылки на конкретные пользовательские интерфейсы, такие как HttpContext), поскольку пользовательский интерфейс также может быть приложением WinForms, а не обязательно веб-приложением. .
Таким образом вы можете избежать возиться с фреймворками Mock, пытаясь имитировать HttpRequests и т. Д., Хотя часто это может быть необходимо.
Вы используете Vista или Windows 7? Если это так, то SetThreadLocale
не работает (даже если он возвращает TRUE, вздох), и вам нужно использовать SetThreadUILanguage
.
Я только что завершил приложение WTL, которое было переведено на 7 разных языков, и пользователь может переключать языки без проблем, которые вы описываете. Я использую SetThreadLocale
в XP и SetThreadUILanguage
в Vista / 7.
Дополнительная информация:
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();
}