verifiable unit test setup property mock dotnet asp.net-mvc unit-testing nunit moq

asp.net-mvc - unit - setup mock



Controlador de prueba Acción que usa User.Identity.Name (2)

Tengo una acción que depende de User.Identity.Name para obtener el nombre de usuario del usuario actual y obtener una lista de sus pedidos:

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

Ahora estoy intentando escribir pruebas unitarias para esto, pero me quedo atascado sobre cómo proporcionar un simulacro para User.Identity.Name. Si ejecuto mi prueba tal como la tengo (sin simulacro de Usuario ...), obtengo una excepción nula.

¿Cuál es el enfoque correcto para esto? Estoy pensando que mi código de Acción no es bueno para las pruebas unitarias.


Puedes usar este código

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

Utiliza el marco de burla Moq , pero seguro que puedes usar lo que quieras.


Una forma mejor de hacerlo sería pasar un argumento de string userName (o un user argumento IPrincipal , si necesita más información que solo el nombre) a ActionMethod, que "inyecta" en una solicitud normal utilizando un ActionFilterAttribute. Cuando lo prueba, solo proporciona su propio objeto simulado, ya que el código del filtro de acción no se ejecutará (en la mayoría de los casos, hay formas de hacerlo, si lo desea específicamente ...)

Kazi Manzur Rashid describe esto en detalle bajo el punto 7 en una excelente publicación de blog .