
単体テストは、現代のソフトウェア開発の非常に重要な部分です。 Webアプリケーションをテストするとき、開発者は、リクエストの受信から結果の発行まで、アプリケーションのあらゆる側面をカバーしようとします。 ASP.NET MVCを使用してプロジェクトを開発する場合、これらのポイントの1つはルーティングメカニズムです。 通常、ルートテストでは多くの頭痛の種が発生し、開発者は多くの関連コードを書く必要がありました。 この記事では、いくつかのツールを使用して、ルートのテストを最小限に抑える方法を示します。
ツール
まず、次のツールが必要です。
設置
NUnitをインストールしてから、nunit.framework(GACから)、Rhino.Mocks、およびMvcContrib.TestHelperをプロジェクトに追加します。

環境は、ルートの単体テストを作成する準備ができています。
テスト
ルートの単体テストの例を示すために、そのようなルートのペアを定義しましょう:
routes.IgnoreRoute( "{resource}.axd/{*pathInfo}" );
routes.MapRoute(
"Product" ,
"Product/{id}" ,
new { controller = "Product" , action = "GetById" }
);
routes.MapRoute( "ProductList" ,
"ProductList/{year}" ,
new { controller = "Product" , action = "List" },
new { year = new YearConstraint() }
);
routes.MapRoute(
"Default" ,
"{controller}/{action}/{id}" ,
new { controller = "Home" , action = "Index" , id = "" }
);
* This source code was highlighted with Source Code Highlighter .
ProductListルートに注意してください。 スキップするコードであるYearConstraint制限が含まれていますが、この制限はパラメーターyearが1900から2100の範囲に属しているかどうかをチェックするだけです。テストのために、次のクラスを作成します。namespace Routing
{
using MvcContrib.TestHelper;
using NUnit.Framework;
using Routing.Controllers;
using System.Web.Routing;
using Rhino.Mocks;
using System.Web;
[TestFixture]
public class TestRoutes
{
[TestFixtureSetUp]
public void SetUp()
{
MvcApplication.RegisterRoutes(RouteTable.Routes);
}
[TestFixtureTearDown]
public void TearDown()
{
RouteTable.Routes.Clear();
}
}
}
* This source code was highlighted with Source Code Highlighter .
NUnitを以前に使用したことがある人にとっては、属性はおなじみのものであり、残りはその目的について少し説明します。- TestFixture-テストでクラスを定義します。
- TestFixtureSetUp-テストを実行する前に実行する必要があるコードでメソッドを定義します。
- TestFixtureTearDown-テストの実行後に実行する必要があるコードを持つメソッドを定義します。
ご覧のとおり、テスト前にルートテーブルを初期化し、テスト後にクリアするメソッドがクラスに作成されています。 最初のテストを書く時間:[Test]
public void TestSimpleRoute()
{
"~/" .Route().ShouldMapTo<HomeController>(x => x.Index());
}
* This source code was highlighted with Source Code Highlighter .
ここでは、MvcContribライブラリを拡張する方法を使用して、プロジェクトのルートへのリクエストの操作性を確認します。これは、決定したルートに従って、デフォルトルートを使用してルーティングする必要があります。 このルートは、デフォルトでASP.NET MVCアプリケーションで作成されます。 プロジェクトルートへのリクエストは、デフォルトでHomeControllerのIndexアクションにルーティングされる必要があります。プロジェクトをコンパイルし、NUnitを実行します。 テストとしてプロジェクトとしてアセンブリを選択したら、[実行]をクリックしてテストを実行します。 下の写真の結果:
テストに合格しました。 残りのテストを追加します。[Test]
public void TestProduct()
{
"~/Product/750" .Route().ShouldMapTo<ProductController>(x => x.GetById(750));
}
[Test]
public void TestProductListValidYear()
{
"~/ProductList/2009" .Route().ShouldMapTo<ProductController>(x => x. List (2009));
}
[Test]
public void TestProductListInvalidYear()
{
Assert.AreNotEqual( "~/ProductList/1800" .Route().Values[ "controller" ], "Product" );
}
[Test]
public void TestIgnoreAxd()
{
"~/someroutetoigonre.axd" .ShouldBeIgnored();
}
* This source code was highlighted with Source Code Highlighter .
ここには4つのテストがあります。
- TestProduct-製品ルートをテストするように設計されています。
- TestProductListValidYear-正しく指定されたパラメーター年で制限のあるルートをテストするためのテスト。
- TestProductListInvalidYear-誤って指定されたパラメーター年で制限されたルートをテストするためのテスト。
- TestIgnoreAxd-axdリソースへのリクエストを無視するルートをテストするためのテスト。
TestProductListInvalidYearをご覧ください。 このテストでは、無効なパラメーターを使用してPriductListルートにアクセスしようとしたときにルーティングをテストします。 チェックはやや間接的です。パラメーターが正しくない場合、ルーティングメカニズムがProductコントローラーを呼び出さないようにします。
そして、最後に注意すべきことは、無視ルートをチェックするためのテストをどれだけ簡単に作成するかです。 ShouldBeIgnored拡張メソッドを使用すると、このようなルートのテストを指定できます。 TestIgnoreAxdテストでは、特定のaxdリソースにアクセスする状況を想像しようとしています。これは、指定されたルートに従って無視する必要があります。
NUnitでテストをコンパイルして実行します。

すべてのテストに合格しました。 作業は完了しました。
おわりに
この記事では、ASP.NET MVCでのユニットテストルートの最も単純なテストケースを取り上げました。 MvcContribライブラリに含まれるツールを使用すると、このようなテストを非常に簡単に作成でき、もちろん開発者の作業が楽になります。
プロジェクトでは、おそらくルーティングメカニズムのより詳細な単体テストを作成する必要があります。 MvcContribはこれを支援します。 喜んでプログラム!
