Как заглушить User.Identity.Name в ASP.NET MVC? - PullRequest
5 голосов
/ 17 ноября 2008

Я пытаюсь выполнить модульное тестирование страницы в моем приложении ASP.NET MVC, которая при публикации удалит элемент пользователя. Я хочу ограничить эту страницу, чтобы она могла быть опубликована только владельцем указанного элемента. Первоначально я хотел просто выполнить быструю проверку в контроллере, который проверял, равен ли HttpContext.Current.User.Identity.Name владельцу элемента, но я быстро понял, что это будет сложно.

Должен ли я создать интерфейс, обеспечивающий доступ к имени текущего вошедшего в систему пользователя?

Ответы [ 3 ]

5 голосов
/ 19 июля 2011

Вы можете использовать этот код

Controller CreateControllerAs(string userName) {

  var mock = new Mock<ControllerContext>();
  mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName);
  mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);

  var controller = new SomeController();
  controller.ControllerContext = mock.Object;

  return controller;
}

Используется moq lib

4 голосов
/ 17 ноября 2008

Последняя строка вашего вопроса, вероятно, является самым быстрым решением, однако я не думаю, что вам нужно создавать интерфейс, HttpContext.Current.User уже IPrincipal и HttpContext.Current.User.Identity уже IIdentity.

Если ваша логика проверки использует какой-либо из этих интерфейсов, контроллер может быть смоделирован для передачи созданного вами IIdentity вместо HttpContext.Current.User.Identity

Надеюсь, это поможет!

2 голосов
/ 17 ноября 2008

Я использую Thread.CurrentPrincipal.Identity.Name. Тривиально создать GenericPrincipal для модульного теста и прикрепить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...