34 votes

Test de l'action du contrôleur qui utilise User.Identity.Name

J'ai une action qui s'appuie sur User.Identity.Name pour obtenir le nom d'utilisateur de l'utilisateur actuel pour obtenir une liste de ses commandes:

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

Maintenant, j'essaie d'écrire des tests unitaires pour cela, mais je suis coincé sur la façon de fournir une maquette pour User.Identity.Name. Si je lance mon test tel que je l'ai (sans maquette pour l'utilisateur ...), j'obtiens une exception Null ...

Quelle est la bonne approche pour cela? Je pense que mon code d'action n'est pas bon pour les tests unitaires.

66voto

Sly Points 8146

Vous pouvez utiliser ce code

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

Il utilise le framework moqing Moq , mais vous pouvez certainement utiliser tout ce que vous voulez.

21voto

Tomas Lycken Points 23432

Une meilleure façon de le faire serait de passer à un string argument userName (ou IPrincipal argument user, si vous avez besoin de plus d'information que juste le nom) à la ActionMethod, qui vous "injecter" dans une requête normale à l'aide d'un ActionFilterAttribute. Lors du test, il vous suffit de fournir votre propre maquette de l'objet, comme l'action du filtre code ne fonctionnera pas (dans la plupart des cas, il existe des moyens pour, si vous voulez...)

Kazi Manzur Rashid décrit en détail au titre du point 7 dans un excellent billet de blog.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X