ASP.NET MVC - teste o controlador de retornar vistas diferentes, dependendo lógica método de ação

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

Pergunta

meu controlador pode retornar pontos de vista diferentes, dependendo lógica método de ação. método de ação 'Criar', pergunta serviço para fazer alguma validação e persistência. Se a validação falhar, método de ação retorna mesma 'Criar' view. Se a validação e salvar corridas OK, vista método de ação retorna 'Index' (RedirectToAction). Eu sei que a obtenção de nome de visão só é possível quando você fornecer explicitamente o nome de exibição como segue:

return View("Create", data);

Eu não quero para codificar o nome da visualização só por causa de testes, mas não consigo descobrir como encontrar qual modo de exibição foi devolvido. Existe uma maneira limpa e elegante para teste que vista foi devolvido dependendo lógica método de ação?

BTW, aqui está o meu código de teste ..

[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
        }
Foi útil?

Solução

Você deve testar o tipo do resultado, ao invés do nome da vista. Se você redirecionar, o resultado não será um ViewResult de qualquer maneira.

Se você retornar RedirectToAction em caso de um erro, então você faria testes como:

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

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

teste de erro:

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

Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top