Я должен создать Модульные тесты на веб-сайт ASP.NET MVC 2.0. Сайт использует аутентификацию Windows.
Я читал на необходимости дразнить контекст HTTP за код, который имеет дело с HttpContext. Я чувствую, что начинаю разобраться с шаблоном DI также. (Дайте классу атрибут типа IRepository и затем передайте в Объекте репозитария при инстанцировании контроллера.)
То, что я не понимаю, однако, является надлежащим способом Дразнить Windows Principal object, доступный через Пользователя. Идентификационные данные. Эта часть HttpContext?
Какое-либо тело имеет ссылку на статью, которая демонстрирует это (или рекомендация для книги)?
Спасибо,
Trey Carroll
Я использовал IoC, чтобы абстрагироваться от этого с некоторым успехом. Сначала я определил класс для представления пользователя, вошедшего в систему:
public class CurrentUser
{
public CurrentUser(IIdentity identity)
{
IsAuthenticated = identity.IsAuthenticated;
DisplayName = identity.Name;
var formsIdentity = identity as FormsIdentity;
if (formsIdentity != null)
{
UserID = int.Parse(formsIdentity.Ticket.UserData);
}
}
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public int UserID { get; private set; }
}
Он принимает IIdentity
в конструкторе для установки своих значений. Для модульных тестов можно добавить еще один конструктор, чтобы обойти зависимость IIdentity
.
Затем я использую Ninject (выберите свой любимый IoC-контейнер, неважно) и создал привязку для IIdentity
следующим образом:
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
Затем внутри моего контроллера я объявляю зависимость в конструкторе:
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
IoC-контейнер видит, что HomeController
принимает объект CurrentUser
, а конструктор CurrentUser
принимает IIdentity
. Это автоматически разрешит зависимости, и вуаля! Ваш контроллер может знать, кто является текущим зарегистрированным пользователем. Мне кажется, что это довольно хорошо работает с FormsAuthentication. Возможно, вы сможете адаптировать этот пример для аутентификации Windows.
Скотт Хансельман показывает в своем блоге , как использовать IPrincipal и ModelBinder, чтобы упростить тестирование контроллера путем имитации IPrincipal.