0

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

大卫

4

2 回答 2

1

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

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

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

        return View();
    }

所以,如果我的理解是正确的,在我的测试之后

因为 = () => 结果 = HomeController.Index();

RedirectToAction 对象被返回并且代码执行在那里停止,即它不调用在 RedirectToAction 中指定的控制器方法。这是有道理的,因为毕竟我们在这里做的是单元测试而不是集成测试。所以,在这里测试 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();
}

如果知识渊博的人可以否认、证实或以其他方式我的理解,那就太好了。

于 2010-12-06T08:15:44.920 回答
0

在您的控制器操作中,您执行的操作return RedirectToAction返回一个RedirectToRouteResult对象,而不是 a 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");

希望这可以帮助。

于 2010-12-04T23:13:38.223 回答