ASP MVC ルートをテストしています。ASP MVC 5.1 の属性ルートに問題があります
次のようなコントローラーがある場合:
public class FooController : Controller
{
[Route("foo")]
[HttpGet]
public ActionResult Get()
{
....
}
[Route("foo")]
[HttpPost]
public ActionResult Post()
{
....
}
}
次に、特定のリクエストに一致するルートをテストするために、 を呼び出しますroutes.GetRouteData
。System.Web.Routing.RouteData
ルートと、一致するコントローラーとアクションを示す値を含むを取得します。
問題は、このルートがRouteCollectionRouteのインスタンスになり
、この内部クラスがこれら 2 つのアクションへのルート グループのラッパーになっていることです。コントローラは にありますRouteData.values
が、アクションはありません。これらの含まれているルートは で取得できますrouteData.Values["MS_DirectRouteMatches"] as IList<RouteData>
。
上記の例では、2 つのアクション メソッドに対して、リストに 2 つのルートがあります。一致したルートのアクション メソッド名を読み取ることができるように、含まれているルートのどれが実際に一致するかを知る必要があります。このルートを解決するにはどうすればよいですか?
まったくないというデザインの選択に少し困惑していRouteCollectionRoute
ます。ルーティング時には、ルート コレクションがあり、次に を呼び出して URL のルートを解決しますGetRouteData
。これでルートは 1 つになりました。しかし、そうであれば、それRouteCollectionRoute
はまだルートのコレクションであり、ルートの解決はまだ終わっていません。RouteCollectionRoute を持つことで何が得られますか? ルート解決は 2 段階のプロセスになりましたか? それとも再帰的なプロセスですか?
ASP MVC の内部を調べていることはわかっていますが、この種のテスト容易性を念頭に置いて設計されていないため、これが唯一の方法です。いくつかの内部クラスやメソッドを公開するなどの単純なことでさえ、大いに役立ちました!