在我的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测试呢?
大卫
答案 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");
希望这有帮助。