ASP.NET MVC: prueba el controlador que devuelve diferentes vistas según la lógica del método de acción

StackOverflow https://stackoverflow.com/questions/1820271

Pregunta

mi controlador puede devolver diferentes vistas dependiendo de la lógica del método de acción. El método de acción 'Crear' solicita al servicio que realice alguna validación y persistencia. Si la validación falla, el método de acción devuelve la misma vista 'Crear'. Si la validación y el guardado funcionan bien, el método de acción devuelve la vista 'Índice' (RedirectToAction). Sé que obtener el nombre de la vista solo es posible cuando proporciona explícitamente el nombre de la vista de la siguiente manera:

return View("Create", data);

No quiero codificar el nombre de la vista solo por las pruebas, pero no puedo encontrar la forma de encontrar qué vista se devolvió. ¿Existe una manera limpia y elegante de probar qué vista se devolvió dependiendo de la lógica del método de acción?

Por cierto, aquí está mi código de prueba ...

[TestMethod]
        public void Create_Post_Should_Return_Create_View_When_Saving_Invalid_Court() {
            var courtServiceMock = new Mock<ICourtService>();
            var userServiceMock = new Mock<IUserService>();
            courtServiceMock.Setup(x => x.Add(It.IsAny<CourtInfo>())).Returns((int?)null);
            userServiceMock.Setup(x => x.Get(It.IsAny<string>(), It.IsAny<UserLoadOptions>())).Returns(new UserInfo { Id = 1 });
            var controller = new CourtsController(courtServiceMock.Object, userServiceMock.Object);
            var controllerContextMock = new Mock<ControllerContext>();
            controllerContextMock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("admin");
            controller.ControllerContext = controllerContextMock.Object;
            var view = controller.Create(new CourtInfo()) as ViewResult;
            Assert.IsTrue(view.ViewName == "Create"); //this line is not working
        }
¿Fue útil?

Solución

Debe probar el tipo del resultado, en lugar del nombre de la vista. Si redirige, el resultado no será un ViewResult de todos modos.

Si devuelve RedirectToAction en caso de error, entonces haría pruebas como:

// setup for success
var result = controller.Create(new CourtInfo());

Assert.IsInstanceOfType(result, typeof(ViewResult));

Prueba de error:

// setup for error
var result = controller.Create(new CourtInfo());

Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top