MVC TDD: как написать тест для ответа.Перенаправить?

#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

Вот хороший ресурс по этому вопросу.

http://weblogs.asp.net/gunnarpeipman/archive/2011/07/16/using-moq-to-mock-asp-net-mvc-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 , поэтому я не следовал этому подходу, я боялся перепроектировать.