6

単体テストで次のようなコードを使用しようとしていますが、

/* Test setup code */
_routes = RouteTable.Routes;
MvcApplication.RegisterRoutes(_routes); //set up the routes as they would be in actual application
/* test code */
Expression<Func<SearchController, ActionResult>> actionFunc;
actionFunc = action => action.Results("x", 3, null);
RouteTestingExtensions.Route(
   "~/Search/Results?searchText=x"
).ShouldMapTo<SearchController>(actionFunc);

問題は、これが「期待される結果 by was Results?searchText=x」で失敗することです。

URL(クエリ文字列を含む)が正しいコントローラー、アクション、および引数に解決されることをテストできるソリューションを誰かが持っていますか?

参考までに、Global.asax.cs に明示的なルート設定はありません。実際のアプリではデフォルト ルートが機能するためです。このテストでは機能しません。

4

2 に答える 2

9

私見カスタムルートのみを単体テストするのは理にかなっています。クエリ文字列パラメーターがコントローラー アクションの引数に変換されるかどうかをテストする必要はなく、実際にはアプリケーションに何の価値ももたらしません。この作業は、既定のモデル バインダーによって行われ、Microsoft によって広範囲に単体テストされています (希望します)。

これMVCContrib.TestHelperにより、カスタムルートをエレガントにテストできます。たとえば、アプリケーションにページングを実装し、SEO 用のきれいな URL を持つカスタム ルートを定義したとします。

routes.MapRoute(
    "Custom",
    "foo/{startPage}/{endPage}",
    new 
    { 
        controller = "Search", 
        action = "Results", 
    }
);

関連するコントローラーは次のとおりです。

public class SearchController : Controller
{
    public ActionResult Results(int startPage, int endPage)
    {
        return View();
    }
}

このルートは次のようにテストできます。

"~/foo/10/20".ShouldMapTo<SearchController>(c => c.Results(10, 20));

Searchこれにより、デフォルトのコントローラーがであり、デフォルトのアクションがであり、とパラメータResultsの両方がルートからそれぞれの値に初期化されることが効果的にテストされます。startPageendPage

于 2010-09-29T21:38:58.550 に答える
1

Phil Haack による次の記事が役立つかもしれません。

  1. http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx
  2. http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx
于 2010-09-29T21:14:39.027 に答える