Настройте тест с использованием MSpec с проблемой условия теста MSpecMVC, RedirectToAction и ViewData - PullRequest
0 голосов
/ 03 декабря 2010

В моем HomeController у меня есть следующее:

 public ActionResult Index()
 {
     SetModuleTitle("Welcome");

     return RedirectToAction( "DashBoard", "Home" );       
 }

и SetModuleTitle определяется в родительском классе следующим образом:

public void SetModuleTitle(string title)
{
    ViewData["ModuleTitle"] = string.Format("PM4 - {0}", title);
}

Ничего страшного в этом нет. Теперь я пытаюсь написать свой тест для тестирования метода SetModuleTitle:

 [Subject( typeof( HomeController ) )]
public class when_the_home_page_is_requested_by_logged_in_user_ : context_for_a_home_controller_for_logged_user
{
    static ActionResult result;

    Because of = () => result = HomeController.Index();

    It should_set_the_module_title = () => ( ( ViewResult ) result ).ViewData[ "ModuleTitle" ].ShouldEqual( "PM4 - Dashboard" );      
}

и мне справедливо говорят, что

Невозможно привести объект типа 'System.Web.Mvc.RedirectToRouteResult' к типу 'System.Web.Mvc.ViewResult'.

Так как мне настроить тест MSpec в этом случае?

David

Ответы [ 2 ]

1 голос
/ 06 декабря 2010

Хорошо, я думаю, что понял, где я ошибался.Однако сначала я должен предоставить код, вызываемый

return RedirectToAction ("DashBoard", "Home");

public ActionResult DashBoard()
    {
        SetModuleTitle("Dashboard");

        return View();
    }

Итак, если мое понимание вернопосле моего теста с именем

из-за = () => result = HomeController.Index ();

возвращается объект RedirectToAction и выполнение кода останавливается на этом, т.е.он не вызывает метод контроллера, указанный в RedirectToAction.Это имело бы смысл, потому что в конце концов мы делаем UNIT-тестирование, а НЕ интеграционное тестирование.Так что нет смысла тестировать метод SetModuleTitle здесь.

Вместо этого должен быть реализован код для проверки вызова метода Dashboard:

[Subject(typeof(HomeController))]
public class when_the_dashboard_page_is_requested_by_logged_in_user : context_for_a_home_controller_for_logged_user
{
    static ActionResult result;

    Because of = () => result = HomeController.DashBoard();

    It should_set_the_module_title = () =>
        {
            ( ( ViewResult ) result ).ViewData[ "ModuleTitle" ].ShouldEqual( "PM4 - Dashboard" );
        };

    It should_return_the_dashboard_page = () => 
        result.ShouldBeAView().And().ShouldUseDefaultView();
}

Если бы кто-то более знающий мог опровергнуть, подтвердить или иным образом мое понимание, это было бы здорово.

0 голосов
/ 05 декабря 2010

В вашем действии контроллера вы делаете return RedirectToAction, который возвращает RedirectToRouteResult объект, а не ViewResult, вот на что он жалуется.

чтобы привести ваш объект результата (в спецификации) к ViewResult, оператор возврата вашего действия должен выглядеть следующим образом:

 public ActionResult Index()
 {
     //Some code here

     return View(/*here maybe a model object*/);       
 }

Чтобы исправить ваш тест, вам просто нужно изменить эту строку:

It should_set_the_module_title = () => ((ViewResult)result ).ViewData[ "ModuleTitle" ].ShouldEqual("PM4 - Dashboard");

для этого:

It should_set_the_module_title = () => ((RedirectToRouteResult)result).ViewData[ "ModuleTitle" ].ShouldEqual("PM4 - Dashboard");

Надеюсь, это поможет.

...