Deep Insider の Tutor コーナー
>>  Deep Insider は本サイトからスピンオフした姉妹サイトです。よろしく! 
特集:ASP.NET MVC Contribのテスト支援機能(前編)

特集:ASP.NET MVC Contribのテスト支援機能(前編)

ASP.NET MVCアプリのURLのテストを簡単に行う

2013年7月2日

ASP.NET MVCを便利に使うためのオープンソース・ライブラリ「MvcContrib」のテスト支援機能を活用して、ASP.NET MVCアプリのURLをテストする方法を説明する。

  • このエントリーをはてなブックマークに追加

 MVC Contrib(次の画面はMVC Contribの公式サイトの表示例)は、ASP.NET MVCを便利に使うためのオープンソース・ライブラリだ。本稿では、URLのテストを簡単に行える、MVC Contribのテスト支援機能について(前後編で)紹介する。コードはC#で記述する。

CodePlexのMVC Contribサイト(Apache LicenseのOSS)

ASP.NET MVCのURLルーティングとは

 ASP.NET MVCでは、URLルーティング機能によって、リクエストURLを柔軟に設計できる。例えば「100番目の記事の2ページ目」というURLの場合、従来のASP.NETではASPXファイルにクエリ文字列を組み合わせて、

  article.aspx?aid=100&pagenum=2

のように書くことが多かった。しかし、ASP.NET MVCでは、

  /article/100/page/2

というURLから、簡単に任意のコントローラーのメソッドを呼び出すことができる。

URLルーティングをテストするメリット

 ASP.NET MVCのURLルーティング機能は便利であるが、設定を誤ると、これまで動いていたURLが突然動かなくなる危険性がある。そこで、URLルーティング用のユニット・テスト(=単体テスト)を用意しておくことによって、ルーティング設定を安心して変更できるようになる。

ASP.NET MVCのテスト環境の構築手順

 それでは、MVC Contribの導入方法を説明していこう。ここでは無償のVisual Studio(Visual Studio Express 2012 for Web)を使用する。

 まず、(メニューバーの)[新しいプロジェクトの作成]メニューより[ASP.NET MVC 4 Web アプリケーション」プロジェクトを作成する(本稿では、次の画面のように「TryMvc」という名前で作成した)。

ASP.NET MVC 4 Webアプリケーションを作成

  プロジェクトの新規作成前にプロジェクト・テンプレートを選択するダイアログ(次の画面を参照)が表示されるので、「インターネット アプリケーション」を選択する。

インターネット・アプリケーションを選択(さらに単体テスト・プロジェクトも作成する)

  上の画面で、プロジェクト作成と同時に単体テスト・プロジェクトも作成する。.NETのテスト・フレームワークには、NUnitxUnit.NETMbUnitなども存在するが、ここでは導入が簡単な「Visual Studio Unit Test」(VSTest)を選択する。

生成されたソリューションの確認

 以上の内容で新規プロジェクトの作成を行うと、Webプロジェクトとテスト・プロジェクトのひな型のソース・ファイル群が生成される。その中の1つのファイルとして、次の画面に示すHomeController.csファイル(本稿で使用)が生成されていることが確認できる。

生成されたASP.NET MVCプロジェクトとテスト・プロジェクト

アプリケーションの実行

 さっそく[デバッグ]メニューの[デバッグ開始]からWeアプリケーションを起動してみよう。ここでは、トップ・ページの表示(次の画面を参照)において、HomeControllerクラスのIndexメソッドが呼び出されることを確認しておくとよいだろう。

アプリケーションのトップ・ページ(/Home/Indexと同じ)

ユニット・テストの実行

 次にテストを実行してみる。(先ほどのデバッグ実行を停止してから)[テスト]メニューの[実行]-[すべてのテスト]をクリックすれば、ユニット・テストが実行される。[テスト エクスプローラー]ウィンドウからテスト結果を確認できる。次の画面に示すように、ここでは全てのテストが成功している。

全テストが成功していることを[テスト エクスプローラー]で確認

MVC Contribのテスト・ライブラリ「TestHelper」のインストール

 テスト準備が整ったところで、URLルーティングのテストを書いていこう。

 本稿ではMVC Contribのテスト・ライブラリ「TestHelper」を利用してテストを行う。MVC Contribはパッケージ管理ツールのNuGetから簡単にインストールできる。[ソリューション エクスプローラー]でテスト・プロジェクトの[参照設定]を右クリックして(表示されるコンテキスト・メニューから)[NuGet パッケージ管理]を選択する。これにより次のようなダイアログが表示される。

NuGetにて「MvcContrib.Mvc3.TestHelper-ci」をインストール

  このダイアログ上で「TestHelper」でオンライン検索して「MvcContrib.Mvc3.TestHelper-ci」をインストールする。なお、MVC Contrib TestHelperにはさまざまな派生バージョンが存在するが、今回はダウンロード数の多い「MvcContrib.Mvc3.TestHelper-ci」を使用する。

TestHelperの拡張メソッド

 MVC Contrib TestHelperが提供している拡張メソッドを呼び出すには、usingディレクティブを使って「MvcContrib.TestHelper」を宣言しておく必要がある。TestHelperが提供する拡張メソッドは下の図のとおりである。

URLテスト用の拡張メソッド(RouteTestingExtensions.cs)
URLテスト用の拡張メソッド(RouteTestingExtensions.cs)

  なお、MVC Contrib TestHelperは、モック・ライブラリのRhino Mocksに依存するが、今回のテスト例では、Rhino Mocksを意識することはほとんどない。

テスト・クラスの作成

 MVC Contrib TestHelperをインストールしたので、まずルーティング用のテスト・クラスを作成する。次の画面は、テスト・プロジェクトに「App_Start」フォルダを作成し、その下に「RouteConfigTest」というテスト・クラスを作成しているところだ。

新しいテスト・クラスを追加(RouteConfigTest.cs)

URLをテストするコード

 それでは、最初のテスト・コードを書いてみよう。まずはHomeControllerクラスのIndexメソッドが正しく呼び出されることをテストする。

C#
using Microsoft.VisualStudio.TestTools.UnitTesting;
using MvcContrib.TestHelper; // MvcContrib TestHelperの名前空間を追加
using System;
using System.Web.Routing;
using TryMvc.Controllers;

namespace TryMvc.Tests.App_Start
{
  [TestClass]
  public class RouteConfigTest
  {
    // 各テストケースの前に実行する処理
    [TestInitialize]
    public void SetUp()
    {
      // (A)ルーティング情報を設定
      RouteTable.Routes.Clear();
      RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

    [TestMethod]
    public void HomeコントロIndexメソッドが呼び出されるはず()
    {
      // (B1)"~/home/index"のURLでHomeControllerのIndexメソッドが呼び出されることをテスト
      "~/home/index".Route().ShouldMapTo<HomeController>(action => action.Index());
    }

    [TestMethod]
    public void URLの場合にHomeIndexが呼び出されるはず()
    {
      // (B2)"~/"のURLで、HomeControllerのIndexメソッドが呼び出されることをテスト
      "~/".Route().ShouldMapTo<HomeController>(action => action.Index());
    }
  }
}
URLルーティングをShouldMapToメソッドでテストするコード(C#)

テストの実行

 テストを実行すると、追加したテストは全て成功する(次の画面を参照)。

追加したテストが成功していることを確認

テスト・コードの解説

 それでは、テスト・コードの中身について詳しく見ていこう。

(A)セットアップ ― ルーティング情報を設定

 ルーティングのテストを行う場合、テスト・メソッドを呼び出す前にルーティングのセットアップを行う。VSTestでは、メソッドにTestInitialize属性を付与することで、テストの実行前に毎回、そのメソッドの処理を呼び出せるようになる。ここではSetUpメソッドにおいて、ルーティング・テーブルを初期化している(具体的にはASP.NET MVCアプリケーションのプロジェクト内にあるRouteConfigクラスのRegisterRoutesメソッドを呼び出している)。

 なお、以下のコードは、ルーティング設定を行うRouteConfigクラスの内容である。

C#
public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}
現在のルーティング設定(RouteConfig.cs)

(B)テスト・メソッド ― ルーティングが正しいかテスト

 続けて、ルーティング設定をテストするコードを確認しよう。ルーティングのテストは、以下の書き方が基本となる。

"テスト対象URL".Route().ShouldMapTo<呼び出されるコントローラー名>(x => x.呼び出されるメソッド名());

 上記のコードの(B1)部では「"~/home/index".Route().ShouldMapTo<HomeController>(action => action.Index())」で、“/home/index”というURLのテストを行っている。Routeメソッドは、URL文字列からルート情報(System.Web.Routing名前空間のRouteDataクラス)を生成する。このルート情報に対して、ShouldMapToメソッドを用いてテストを行う。ShouldMapToメソッドでは、呼び出されるコントローラーと引数をチェックできる(引数については次回の後編でより詳しく説明する)。

 (B2)部では“~/”というURLのテストを行っており、「http://ホスト名/」というルートURLにアクセスしたときのテスト・コードである。ここでは、デフォルト値であるHomeControllerクラスのIndexメソッドが呼び出されることをテストしている。

最後に

 以上、この前編では、MVC Contribを利用してURLルーティングのテストを行う方法を紹介した。テスト対象のURLに対して、ShouldMapToメソッドを呼び出すだけで簡単にテストできることが分かったと思う。次回は別のURLパターンを用いて、テストを行う方法を紹介する。

特集:ASP.NET MVC Contribのテスト支援機能(前編)
1. 【現在、表示中】≫ ASP.NET MVCアプリのURLのテストを簡単に行う

ASP.NET MVCを便利に使うためのオープンソース・ライブラリ「MvcContrib」のテスト支援機能を活用して、ASP.NET MVCアプリのURLをテストする方法を説明する。

特集:ASP.NET MVC Contribのテスト支援機能(前編)
2. URLパターンを用いてテストを行う

URLルーティングの設定を変更しながら、ASP.NET MVCアプリのテストを追加していく方法について説明。また、MvcContribのテスト支援機能以外の機能についても簡単に紹介する。

サイトからのお知らせ

Twitterでつぶやこう!