Подтвердить что ты не робот

Контроллер тестирования Действие, использующее 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..

Каков правильный подход? Я думаю, что мой код действия не подходит для модульного тестирования.

4b9b3361

Ответ 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, но уверен, что вы можете использовать что угодно.