ASP.NET MVC - test the controller returning different views depending on action method logic
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
}
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));
精彩评论