ASP.NET MVCにおけるテスト
前編でも解説したように、ASP.NET MVCの魅力の1つにテストの容易性・親和性というのが挙げられます。前回作成したサンプルアプリケーションに対して、テストプロジェクトを追加します。[ファイル]-[追加]-[新しいプロジェクト]を選択し、テストプロジェクトから[ASP.NET MVC Project Test Template]を選択しましょう。テストの作成手順はVSTSの単体テスト作成と変わりありません。
実際にサンプルを見てみましょう。
[TestMethod()] public void HelloTest() { // PubsControllerの準備 PubsController controller = new PubsController(); // 実行 ViewResult result = controller.Hello() as ViewResult; // 検証 ViewDataDictionary viewData = result.ViewData; Assert.AreEqual("Hello, MVC Framework!", viewData["Hello"]); Assert.AreEqual("Titles", viewData["Title"]); }
実行結果は次のとおりです(図7~8)。
同様に、URLルーティングに対しても簡単にテストが行えます。しかし、URLルーティングに対するテストでは、HttpContext
を利用することになります。本来であれば、さまざまな準備が必要になりますが、サンプルではASP.NET MVCの開発者の一人Stephenさんが、擬似的なHttpContextを作成するFakeHttpContext
クラスなどをまとめた「MvcFakes.dll」を自身のBlogで提供しているので、そちらを利用します。
[TestMethod()] public void RegisterRoutesTest() { RouteCollection routes = new RouteCollection(); GlobalApplication application = new GlobalApplication(); GlobalApplication.RegisterRoutes(routes); // 擬似HttpContextを利用してURLルートマッピングの設定 var context = new FakeHttpContext("~/Pubs/info/MC2222"); RouteData route = routes.GetRouteData(context); // ルートマッピング検証 Assert.IsNotNull(route, "探してるルートは見つかりませんでした"); Assert.AreEqual("Pubs", route.Values["controller"], "Pubs controller expected"); Assert.AreEqual("info", route.Values["action"], "info expected Pubs action"); Assert.AreEqual("MC2222", route.Values["id"], "2"); }
実行結果は次のとおりです(図9~10)。
ControllerクラスとURLルーティングに関するテストでは、従来のASP.NETと違い、実際にアプリケーションを実行しなくてもテストを実行することが、確認できました。この点から、従来のASP.NETよりもテスト部分において優れていることがわかっていただけたかと思います。