Testowanie działania kontrolera wykorzystującego User.Identity.Name

Mam działanie, które polega na User.Identity.Name aby uzyskać nazwę użytkownika bieżącego użytkownika, aby uzyskać listę jego zamówień:

public ActionResult XLineas()
    {
        ViewData["Filtre"] = _options.Filtre;
        ViewData["NomesPendents"] = _options.NomesPendents;
        return View(_repository.ObteLiniesPedido(User.Identity.Name,_options.Filtre,_options.NomesPendents));
    }

Teraz próbuję napisać testy jednostkowe do tego, ale utknąłem na tym, jak zapewnić makietę dla User.Identity.Name. jeśli uruchamiam test tak, jak go mam (bez mocka dla użytkownika...), Dostaję Null.. wyjątek.

Jakie jest właściwe podejście do tego? Myślę, że mój kod działania nie jest dobry do testów jednostkowych.

Author: Carles Company, 2009-09-07

2 answers

Lepszym sposobem na to byłoby przekazanie string argumentu userName (lub IPrincipal argumentu user, jeśli potrzebujesz więcej informacji niż tylko nazwy) do ActionMethod, które "wstrzykujesz" w normalnym żądaniu za pomocą ActionFilterAttribute. Kiedy go testujesz, po prostu dostarczasz swój własny mock object, ponieważ kod filtra akcji nie zostanie uruchomiony(w większości przypadków-są sposoby, jeśli chcesz...)

Kazi Manzur Rashid opisuje to szczegółowo w punkcie 7 w doskonałej wpis na blogu .

 21
Author: Tomas Lycken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-28 06:59:38

Możesz użyć tego kodu

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;
}

Używa Moq wyśmiewający framework, ale na pewno możesz używać wszystkiego, co chcesz.

 65
Author: Sly,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-02 08:43:43