Question

my controller can return different views depending on action method logic. Action method 'Create' asks service to do some validation and persistence. If validation fails, action method returns same 'Create' view. If validation and save runs OK, action method returns 'Index' view (RedirectToAction). I know that getting view name is possible only when you explicitly provide the view name like follows :

return View("Create", data);

I don't wan't to hardcode the view name only because of tests, but can't figure out how to find which view was returned. Is there a clean and elegant way to test which view was returned depending on action method logic?

BTW, here is my test code..

[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
        }
Was it helpful?

Solution

You should test the type of the result, rather than the name of the view. If you redirect, the result won't be a ViewResult anyway.

If you return RedirectToAction in case of an error, then you would do tests like:

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

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

Error test:

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

Assert.IsInstanceOfType(result, typeof(RedirectToRouteResult));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top