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( "ダッシュボード", "ホーム" );

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

        return View();
    }

したがって、私の理解が正しければ、テストが呼び出された後

= () => 結果 = 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();
}

より知識のある人が私の理解を否定、確認、またはそうでなければそれができれば、それは素晴らしいことです.

于 2010-12-06T08:15:44.920 に答える
0

コントローラのアクションでは、オブジェクトではなくオブジェクトreturn RedirectToActionを返します。これは、それが不平を言っていることです。RedirectToRouteResultViewResult

結果オブジェクト(仕様)を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");

お役に立てれば。

于 2010-12-04T23:13:38.223 に答える