2009-11-30 3 views
3

mon contrôleur peut renvoyer 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 la validation et la sauvegarde s'exécutent correctement, la méthode action renvoie la vue "Index" (RedirectToAction). Je sais que l'obtention du nom de vue est possible que lorsque vous fournissez explicitement le nom de vue comme suit:ASP.NET MVC - tester le contrôleur en retournant différentes vues en fonction de la logique de la méthode d'action

return View("Create", data); 

Je ne wan't coder en dur le nom de vue seulement en raison de tests, mais ne peut pas comprendre comment trouver quelle vue a été retourné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 
     } 

Répondre

4

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

Si vous revenez RedirectToAction en cas d'erreur, alors vous faire des tests comme:

// 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)); 
Questions connexes