Контроллер тестирования Действие, использующее User.Identity.Name
У меня есть действие, основанное на User.Identity.Name, чтобы получить имя пользователя текущего пользователя, чтобы получить список его заказов:
public ActionResult XLineas()
{
ViewData["Filtre"] = _options.Filtre;
ViewData["NomesPendents"] = _options.NomesPendents;
return View(_repository.ObteLiniesPedido(User.Identity.Name,_options.Filtre,_options.NomesPendents));
}
Теперь я пытаюсь написать для этого единичные тесты, но я зациклился на том, как предоставить Mock для User.Identity.Name. Если я запустил свой тест, поскольку у меня есть (без макета для пользователя...), я получаю исключение Null..
Каков правильный подход? Я думаю, что мой код действия не подходит для модульного тестирования.
Ответы
Ответ 1
Лучший способ сделать это - передать аргумент string
userName
(или аргумент IPrincipal
user
, если вам нужна дополнительная информация, а не только имя) ActionMethod, который вы "вводите" в обычном запросе с использованием ActionFilterAttribute. Когда вы проверяете его, вы просто отправляете свой собственный макет-объект, так как код фильтра действия не будет запускаться (в большинстве случаев - есть способы, если вы специально хотите...)
Kazi Manzur Rashid подробно описывает это в пункте 7 в отличном сообщении в блоге.
Ответ 2
Вы можете использовать этот код
public SomeController CreateControllerForUser(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 mocking framework, но уверен, что вы можете использовать что угодно.