Ответ 1
Возврат ActionResult вместо того, чтобы "делать все, что делает ActionResult" (т.е. напрямую использовать Response.Redirect или пытаться визуализировать представление через Response OutputStream) дает вам действительно хорошее преимущество: Unit Testing очень просто на что, тем более, что вам обычно не нужен веб-сервер для unit test проектов MVC.
Приложение: В качестве примера для перенаправления:
Если вы делаете
return Redirect(newUrl);
в вашем контроллере, ваш unit test теперь может
- Убедитесь, что возвращаемое значение имеет тип "RedirectResult"
- Посмотрите URL-адрес, который перенаправляется, проверяя result.Url после его отправки в RedirectResult
- Все без необходимости разворачивать IIS или пытаться "очистить" перехват вызова Response.Redirect
- В конце дня RedirectResult вызывает Response.Redirect в нем функцию ExecuteResult, но ваш контроллер unit test сидит перед этим
Добавление 2: И пока я нахожусь на нем, вот пример пользовательского ActionResult:
http://www.stum.de/2008/10/22/permanentredirectresult/
Это просто показать, что они не "Черная магия". Они на самом деле довольно просты: ваш контроллер возвращает результат действия, а MVC Runtime в конечном итоге вызовет на нем функцию ExecuteResult, передав в ControllerContext, с которым может взаимодействовать ActionResult. Все дело в том, чтобы разделить части M-V-C, сделать код многоразового использования и сделать модульное тестирование проще или короче: дать очень чистую Framework.