SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ASP.NET MVC3入門

ASP.NET MVC 3における単体テストの基本と記述方法

ASP.NET MVC3入門(6)

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

ASP.NET MVCにおける単体テストと単体テストTips

 今回は以下の順番でテストを実施します。

  • URLルーティング
  • リポジトリクラス
  • コントローラー

 今回は最初に挙動を決めるであろうURLルーティングからテストを実施していきます。なお、個別のテストに入る前にテストの実行方法について簡単にご紹介します。

 テストはメニューまたはツールバーから実行できます。メニューから実行する場合は以下の手順で実施できます。

 [テスト]-[実行]または[デバッグ]-[現在のコンテキストのテスト]または[ソリューションのすべてのテスト]を選択(図1)。

図1 メニューからテストを実行
図1 メニューからテストを実行

 ツールバーから実行する場合は実行したいモードのテスト形式のボタンをクリックするだけです(図2)。

図2 ツールバーからテストを実行
図2 ツールバーからテストを実行

 なお、テストを記載する際のポイントとしてテストコードの正確性を確認する作業があります。

 テストコードを記述した後、理想値にあえて異なる値を設定し、テストを失敗させます。その後理想値と実行結果が一致するか確認することで、テストの正確性が得られます(図3~4)。

図3 テスト失敗時
図3 テスト失敗時
図4 テスト成功時
図4 テスト成功時

 それでは個別のテストを確認していきましょう。

URLルーティングの単体テスト

 URLルーティングのルーティングルールはGlobal.asaxファイル内のRegisterRoutesメソッドに記載します。MVCプロジェクト作成時は以下の2つの機能が実装されています。

  • IgnoreRouteメソッドで{resource}.axd/{*pathInfo}というWebリソースへのアクセスルートの無効化
  • 既定のルーティングルールとして{controller}/{action}/{id}の指定

 例えばXXXX.axdと記載されているルートが無効化されているかを確認するテストや、CodeZineControllerクラスのarticleアクションメソッドに適当な記事番号を割り振っている場合、CodeZine/article/5754などのリクエストを正しく処理できるかを確認するテストを記述することになります。

 実際のURLルーティングのテストコードは以下のとおりです。

URLルーティングのテストメソッド
// ①ルート無効化の確認テスト
[TestMethod]
public void RoutingTest()
{
    //// 準備 モック作成とルートコレクションへの登録
    RouteData actual;
    var mockcontext = new Mock<HttpContextBase>();
    mockcontext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath)
        .Returns("~/routeHandler.axd");
    var routes = new RouteCollection();
    MvcApplication.RegisterRoutes(routes);

    //// 実行 モックと一致するルートを取得
    actual = routes.GetRouteData(mockcontext.Object);

    //// アサート ルートの検証
    Assert.IsNotNull(actual);
    Assert.IsInstanceOfType(actual.RouteHandler, typeof(StopRoutingHandler));
}

// ②ルート確認テスト
[TestMethod]
public void RouteCheck()
{
    //// 準備 モック作成とルートコレクションへのルート登録
    RouteData actual;
    var mockcontext = new Mock<HttpContextBase>();
    mockcontext.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath)
        .Returns("~/CodeZine/article/5754");
    var routes = new RouteCollection();
    MvcApplication.RegisterRoutes(routes);

    //// 実行 モックと一致するルートを取得
    actual = routes.GetRouteData(mockcontext.Object);

    //// アサート ルートの検証
    Assert.IsNotNull(actual);
    Assert.AreEqual("CodeZine", actual.Values["controller"]);
    Assert.AreEqual("article", actual.Values["action"]);
    Assert.AreEqual("5754", actual.Values["id"]);
}

 ①と②に分けていますが、基本的な部分は両方変わりありません。

 それぞれ、最初にモックを作成しています。URLルーティングの単体テストのキモはルートを取得するGetRouteDataメソッドのパラメータであるHttpContextBaseクラスのモックを作成する点です。HTTPの情報を扱うオブジェクトを生成する場合、都度アプリケーションサーバーを起動し、実際にアプリケーションを実行しなければ生成できないHttpContextBaseオブジェクトを生成するのは手間ばかり増えテストの本質から離れてしまいます。しかし、Moqを使うことで簡単にメソッドなどのインターフェースのみを実装したダミーのオブジェクトとなるモックを作成できます。モック作成後、GetRouteDataメソッドのパラメータにモックを指定することでモックに指定したルートが取得できます。

 最後にアサートでRouteDataオブジェクトが取得できているかをIsNotNullメソッドで確認し、各ルートが無効化されているか、理想値と同一か確認するだけです。

 続いてリポジトリクラスの単体テストを見てみましょう。

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET MVC3入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト ナオキ(ナオキ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/6543 2012/05/09 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング