ASP.NET MVC - 根据操作方法逻辑测试控制器返回不同的视图

时间:2009-11-30 14:51:29

标签: asp.net-mvc unit-testing tdd moq

我的控制器可以根据操作方法逻辑返回不同的视图。 Action方法'Create'要求服务进行一些验证和持久化。如果验证失败,则action方法返回相同的“Create”视图。如果验证和保存运行正常,则操作方法返回“索引”视图(RedirectToAction)。 我知道只有在明确提供如下视图名称时才能获取视图名称:

return View("Create", data);

我不想仅因为测试而对视图名称进行硬编码,但无法弄清楚如何查找返回的视图。是否有一种干净而优雅的方法来测试根据操作方法逻辑返回哪个视图?

BTW,这是我的测试代码..

[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
        }

1 个答案:

答案 0 :(得分:4)

您应该测试结果的类型,而不是视图的名称。如果您重定向,结果将不会是ViewResult

如果在发生错误时返回RedirectToAction,那么您将执行以下测试:

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

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

错误测试:

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

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