ASP.NET MVC - teste o controlador de retornar vistas diferentes, dependendo lógica método de ação
-
10-07-2019 - |
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
}
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));