使用MSpec与MSpecMVC,RedirectToAction和ViewData测试条件问题设置测试

时间:2010-12-03 16:05:56

标签: asp.net-mvc-2 testing mspec

在我的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测试呢?

大卫

2 个答案:

答案 0 :(得分:1)

好的,我想我已经明白我哪里出错了。但是,首先我必须提供由

调用的代码
  

返回RedirectToAction(“DashBoard”,“Home”);

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

        return View();
    }

所以,如果我的理解是正确的,那么我的测试称为

  

因为=()=> result = HomeController.Index();

返回RedirectToAction对象并且代码执行在那里停止,即它不调用RedirectToAction中指定的控制器方法。这是有道理的,因为毕竟我们在这里做的是UNIT测试和非集成测试。 因此,在此测试SetModuleTitle方法没有意义。

相反,应该实现测试方法仪表板调用的代码:

[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();
}

如果有更多知识渊博的人可以否认,确认或以其他方式理解,那就太棒了。

答案 1 :(得分:0)

在您的控制器操作中,您return RedirectToAction会返回一个RedirectToRouteResult对象,而不是ViewResult,这就是它所抱怨的内容。

为了将您的结果对象(在de spec中)转换为ViewResult,您的操作的return语句必须如下所示:

 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");

希望这有帮助。