#asp.net-mvc-3 #tdd #response.redirect
#asp.net-mvc-3 #tdd #response.redirect
Вопрос:
Я новичок в MVC и TDD, поэтому, если это глупый вопрос, пожалуйста, избавьте меня 🙂
Что я пытаюсь сделать, так это то, что я создал контроллер входа, и я просто хочу написать тест для этого контроллера. Дело в том, что контроллер входа выполняет ответ.Перенаправление внутри, это работает нормально, если это правильный запрос, но когда я запускаю свой тест, он завершается неудачей, так как нет объекта ответа.
итак, как я могу протестировать свой контроллер входа, который перенаправляет внутренне??
Ответ №1:
Когда вы хотите выполнить перенаправление, вы должны использовать actionresult: Redirect("url")
. В вашем тесте вы можете проверить, имеет ли actionresult тип RedirectResult и / или имеет ли он правильные значения свойств.
Комментарии:
1. Сначала я попытался перенаправить («url»), но, думаю, он ничего не делал, он не перенаправлял на мою домашнюю страницу, поэтому я перешел к Response. Перенаправление («url»).
Ответ №2:
Ваш метод действия должен возвращать результат перенаправления. Если вы точно знаете, каким должен быть URL-адрес, вы можете протестировать Url
свойство.
Ответ №3:
Я не сторонник TDD, но что-то подсказывает мне, что HttpContextBase — ваш друг: http://msdn.microsoft.com/en-us/library/system.web.httpcontextbase.aspx
Вот хороший ресурс по этому вопросу.
Надеюсь, это поможет.
Комментарии:
1. На самом деле, HttpContextBase — это то, чего следует избегать в действиях, если вам нужны тестируемые контроллеры. Нетривиально создать правильно работающий макет для HttpContext, и это излишне усложняет тест. В общем, лучший подход — позволить взаимодействию с HttpContext обрабатываться соответствующим результатом действия, в данном случае Redirect или RedirectToAction .
2. Я согласен с Marnix, HttpContextBase делает мой тест слишком сложным, фактически в шаблонах проектов MVC 3 по умолчанию они реализованы. Я удалил их из своего проекта, мой проект не настолько велик, чтобы мне требовался такой сложный тест, но определенно пойду на такой тест, как только мое приложение станет большим.
Ответ №4:
Одним из шаблонов, которые вы можете использовать для тестирования кода навигации внутри контроллера / презентатора, является ApplicationController .
Взгляните на следующее описание PEAA: Контроллер приложения
Мы внедрили контроллер приложений в наш ASP.NET приложение.
ApplicationController.Navigate(view: "LoginScreen", argument: userId);
ApplicationController проверяет, какие NavigationWorkflows зарегистрированы, и переносит навигацию в правильный класс.
В ваших модульных тестах вы можете имитировать NavigationWorkflow с помощью чего-то вроде rhino mocks и передать это вашему ApplicationController. Затем вы можете проверить, вызываются ли правильные методы навигации в вашем рабочем процессе.
Итак, вместо вызова ответа.Перенаправление, вы делегируете ответственность за навигацию отдельному классу, который можно заменить модульным тестированием.
Комментарии:
1. Я думал о создании отдельного класса для этого, но это похоже на то, что мне нужен ответ. Перенаправление только в этот раз я не мог придумать никаких других сценариев, в которых мне придется использовать Response.redirect вместо RedirectToAction , поэтому я не следовал этому подходу, я боялся перепроектировать.