SHOEISHA iD

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

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

ASP.NET MVCフレームワーク 正式版 入門

ASP.NET MVCで認証、テスト、フィルタ機能、AJAXを活用しよう

ASP.NET MVCフレームワーク 正式版 入門(3)

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

ASP.NET MVCにおけるテスト

 第1回でも解説したように、ASP.NET MVCの魅力の1つにテストの容易性・親和性という点が挙げられます。前回作成したサンプルアプリケーションに対して、テストプロジェクトを追加します。[ファイル]-[追加]-[新しいプロジェクト]を選択し、テストプロジェクトから[ASP.NET MVC Project Test Template]を選択しましょう。テストの作成手順はVSTSの単体テスト作成と変わりありません。

 実際にサンプルを見てみましょう(図9~10)。

図9 テスト失敗時の画面
図9  テスト失敗時の画面
図10 テスト成功時の画面
図10 テスト成功時の画面

 テストコードは以下のようになります。

PubsControllerTest.csの一部
[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"]);
}

 同様に、URLルーティングに対しても簡単にテストが行えます(図11~12)。しかし、URLルーティングに対するテストでは、HttpContextを利用することになります。本来であれば、さまざまな準備が必要になりますが、サンプルでは擬似的なHttpContextを作成するために「moq」を利用します。moqは参照設定に加えるだけで簡単にモックオブジェクトを生成し利用できます。moqの魅力はいくつかありますが、テストを記述していてもモックテストを利用したことがない開発者をターゲットにしているためモックテストを少ない学習コストで簡単に利用できる点にあります(モックテストを利用したことがある方はより少ない学習コストで利用できます)。moqに関する詳細はリンク先を参照ください。

図11 テスト失敗時の画面
図11 テスト失敗時の画面
図12 テスト成功時の画面
図12 テスト成功時の画面
GlobalApplicationTest.csの一部
using System.Web;
using System.Web.Routing;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Moq;

// <中略>

        [TestMethod]
        public void DefaultRoutTest()
        {
            RouteCollection routes = new RouteCollection();
            MvcApplication.RegisterRoutes(routes);

            // 擬似HttpContextを利用してURLルートマッピングの設定
            RouteData route = GetMockContext(routes,"~/Pubs/Details/BU1032");

            // ルートマッピング検証
            Assert.IsNotNull(route, "探してるルートは見つかりませんでした");
            Assert.AreEqual("Pubs", route.Values["controller"],
                            "Pubs コントローラーは存在しません");
            Assert.AreEqual("Details", route.Values["action"],
                            "Detailsアクションメソッドは存在しません。");
            Assert.AreEqual("BU1032", route.Values["id"], "IDが違います。");
        }
        
        // 疑似HttpRequestとHttpContextを生成
        private RouteData GetMockContext(RouteCollection routes,string url)
        {
            var request = new Mock<HttpRequestBase>();
            // パラメタのURLを相対パスとして設定
            request.Setup(
               req => req.AppRelativeCurrentExecutionFilePath).Returns(url);
            var context = new Mock<HttpContextBase>();
            // 疑似リクエストパスから疑似HttpContextを生成
            context.Setup(ctx => ctx.Request).Returns(request.Object);

            // rdataをルートマッピングの設定として返す
            RouteData rdata = routes.GetRouteData(context.Object);
            return rdata;
        }

 GetMockContextメソッドでは、ひとことで言ってしまうとHttpRequestBaseクラスと、HttpContextBaseクラスのモックオブジェクトを生成しています。

 具体的に説明すると、それぞれのモックオブジェクトに対して、Setupメソッドを使いMock<T>で宣言された型のオブジェクトをセットアップします。セットアップに必要な情報はラムダ式で記述していきます。その結果をReturnsメソッドで、型を定めて返しています。上記コードでは、requestオブジェクトに、AppRelativeCurrentexecutionFilePathメソッドを使い、アプリケーション仮想パスを取得後、相対パスに変換します。相対パスはをパラメタとして渡されたURLを利用し、擬似的なリクエストを作成しています。

 続いて、contextオブジェクトに生成したrequestオブジェクトを渡し、それを活用して擬似HttpContextを生成しています。

 ルートに対するMockルートオブジェクト生成後は、通常のテストどおり、生成したMockルートオブジェクトに対してルートマッピングのテストを行っています。

 ControllerクラスとURLルーティングに関するテストでは、従来のASP.NETと違い、実際にアプリケーションを実行しなくてもテストを実行できます。この点から、従来のASP.NETよりもテスト部分において優れていることがお分かりいただけるかと思います。

まとめ

 今回はASP.NET MVCで実開発を行う際に利用が多くなるであろうフィルタ/AJAX/単体テストについて触れました。第1回第3回までの内容をもとに、MSDNを参照しながら構築をすればある程度のWebアプリケーションが構築できるようになるかと思います。

 次回は、ASP.NET MVCにおいて主流となり得るRepositoryパターンについて解説予定です。お楽しみに。

参考文献

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

  • X ポスト
  • このエントリーをはてなブックマークに追加
ASP.NET MVCフレームワーク 正式版 入門連載記事一覧

もっと読む

この記事の著者

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

静岡県榛原町生まれ。一橋大学経済学部卒業後、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/4256 2009/09/08 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング