ASP.NET MVC - teste le contrôleur en renvoyant différentes vues en fonction de la logique de la méthode d'action

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

Question

Mon contrôleur peut retourner différentes vues en fonction de la logique de la méthode d'action. La méthode d'action 'Create' demande au service d'effectuer une validation et une persistance. Si la validation échoue, la méthode d'action renvoie la même vue "Créer". Si validation et sauvegarde fonctionnent correctement, la méthode action renvoie la vue 'Index' (RedirectToAction). Je sais que l’obtention du nom de la vue n’est possible que si vous fournissez explicitement le nom de la vue comme suit:

return View("Create", data);

Je ne veux pas coder le nom de la vue en dur uniquement à cause de tests, mais je ne vois pas comment trouver quelle vue a été renvoyée. Existe-t-il un moyen propre et élégant de tester quelle vue a été renvoyée en fonction de la logique de la méthode d'action?

BTW, voici mon code de test ..

[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
        }
Était-ce utile?

La solution

Vous devez tester le type du résultat plutôt que le nom de la vue. Si vous redirigez, le résultat ne sera de toute façon pas un ViewResult .

Si vous renvoyez RedirectToAction en cas d'erreur, vous devez effectuer des tests tels que:

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

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

Test d'erreur:

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

Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top