27

私は、標準の特別なコントローラーではなく、いくつかの簡単な MS 単体テストを行っています。

プロパティを確認するとViewName、返されたViewResultオブジェクトから、 ""(空) です。

ViewNameの名前が​​暗示されているという印象を受けていますView( ASP.NET MVC コントローラーのテストに関するこの MS の記事で示唆されているように)。

ところで、ViewData をテストすると、すべてが正しく表示されます。

これが私が持っているコードです...

public ActionResult Index(int? page, string tag)
{
    if (page == null || page <= 0)
    {
        page = 1;
    }

    var viewData = new IndexViewData
                       {
                       ... my property setters, etc ...
                       };
    return View(viewData);
}

[TestMethod]
public void Index_Action_Should_Return_Index_View_For_Default_HomePage()
{
    // Arrange.
    var controller = PostController; // Wrapper, cause I use D.I.

    // Act.
    ViewResult viewResult = controller.Index(null, null) as ViewResult;

    // Assert.
    Assert.IsNotNull(viewResult);
    Assert.AreEqual("Index", viewResult.ViewName); // This is false/fails.

    var indexViewData = viewResult.ViewData.Model as IndexViewData;
    Assert.IsNotNull(indexViewData); // This is true.
}
4

4 に答える 4

2

個人的には、MVC2 が提供するテスト機能がややぎこちないことがわかりました。すでに存在するより良いものがあると思いますが、アクションをテストするための単純なクラスを作成することになりました。優れたオープン ソースのJava MVC フレームワークである Stripesが提供するMockRoundTrip.

アクションをテストするときにアクションの宛先ページを取得するために使用される、 と呼ばれるメソッドを次に示しますgetTripDestination()。ビュー名が明示的に設定されているかどうかに関係なく、正しい結果を返します

    //Get the destination page of the request, using Runtime execution pattern of MVC, namely
    //if no ViewName is explicitly set in controller, ViewResult will have an empty ViewName
    //Instead, current action name will be used in its place
    public string getTripDestination()
    {
       RouteData routeData = getRouteData();
       ViewResult viewResult = (result is ViewResult) ? (ViewResult)result : null;
       string tripDestination = (viewResult != null) ? viewResult.ViewName : "";

       return (tripDestination != "") ? tripDestination : (String)routeData.Values["action"];
    }

    private RouteData getRouteData()
    {
       HttpContextBase context = controller.ControllerContext.RequestContext.HttpContext;
       return RouteTable.Routes.GetRouteData(context);
    }
于 2010-12-06T23:15:52.157 に答える
0

ビュー名は、フレームワークによって自動的に設定されます。しかし、単体テストを行うと、フレームワークを短絡してしまい、名前を設定するものが何も残っていません。

そのため、単体テストを行うときに、アクションでビュー名を明示的に設定する必要があります。本当に、本当に規則に依存したい場合は、null または空をチェックすることもできます。

于 2009-04-24T22:33:41.323 に答える
0

Controller.View()のドキュメントには次のように記載されています。

View クラスのこのメソッド オーバーロードは、空の ViewName プロパティを持つ ViewResult オブジェクトを返します。コントローラー アクションの単体テストを作成している場合は、文字列ビュー名を取らない単体テストの空の ViewName プロパティを考慮してください。

実行時に ViewName プロパティが空の場合、現在のアクション名が ViewName プロパティの代わりに使用されます。

したがって、現在のアクションと同じ名前のビューが期待される場合、それが空の文字列であることをテストできます。

または、Controller.View(String) メソッドが ViewName を設定します。

于 2016-06-15T09:59:14.327 に答える