ASP.NET MVC - тестирование контроллера, возвращающего различные представления в зависимости от логики метода действия - PullRequest
3 голосов
/ 30 ноября 2009

мой контроллер может возвращать различные представления в зависимости от логики метода действия. Метод действия «Создать» просит службу выполнить некоторую проверку и сохранение. Если проверка не пройдена, метод действия возвращает то же представление «Создать». Если проверка и сохранение выполняются успешно, метод действия возвращает представление «Индекс» (RedirectToAction). Я знаю, что получение имени представления возможно только в том случае, если вы явно указали имя представления следующим образом:

return View("Create", data);

Я не хочу жестко кодировать имя представления только из-за тестов, но не могу понять, как найти, какое представление было возвращено. Есть ли чистый и элегантный способ проверить, какое представление было возвращено в зависимости от логики метода действия?

Кстати, вот мой тестовый код ..

[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 Ответ

4 голосов
/ 30 ноября 2009

Вы должны проверить тип результата, а не имя представления. Если вы перенаправите, результат все равно не будет 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));
...