2

複雑な Asp.Net MVC-3 Web サイトの一部として、約 12 種類のメール フォームがあります。

各フォームには処理ロジックが大きく異なるため、フォームごとに FormsController 内に異なる ActionMethod があります。

各フォームには、1 つのルート マッピングで定義された URL でアクセスできます。

routes.MapRoute(
    "Forms",
    "forms/{action}",
    new { controller = "Forms", action = "Index" }
);

私はアクション名のリストをリストに保持しています。これは、DRY の目的で設定されています (フォームのナビゲーションなどに入力するため)。この一連のフォームを頻繁に更新する必要があり、フォーム名が URL に表示される (したがって、アクション名として定義される) ようにリファクタリングしたい場合があります。リストが定義されたアクションメソッドの名前に対応することをテストしたい

各フォーム URL が正しいルート マッピングによってキャッチされるかどうかをテストするのは簡単です。MoqでNUnitを使用しています:

MockHttpContext.Setup(x => x.Request.AppRelativeCurrentExecutionFilePath)
     .Returns("~/Forms/" + formUrlName);
var routeData = Routes.GetRouteData(MockHttpContext.Object);

Assert.AreEqual("Forms", routeData.Values["Controller"].ToString());            
Assert.AreEqual(formUrlName, routeData.Values["Action"].ToString());

ただし、これは、指定されたアクション メソッド自体が Froms コントローラーで定義されていることを保証するものではありません。

また、注意: フォームの URL でダッシュを許可し、引き続きアクション メソッド名にマップするには、次のようにフィルターを使用してアクション名を定義しています。

[ActionName("blog-subscription-request")]
public ActionResult BlogSubscriptionRequest() {...

そう...

質問:アクション メソッド名のリスト内の各項目が、FormsController 内に存在する実際の ActionMethod に対応しているかどうかをテストするにはどうすればよいですか?**

4

1 に答える 1

1

MvcContrib の TestHelperプロジェクトを使用して成功しました。ルートを定義し、次のように特定のコントローラーとアクションに確実にマップすることができます。

[Test]
public void homeIndex()
{
    "~/forms/blog-subscription-request".ShouldMapTo<FormsController>(x => x.BlogRequest());
}

これは問題の完全な解決策ではないかもしれませんが、アクションがあまりない場合は適切な出発点になる可能性があります。

于 2012-09-19T06:05:57.270 に答える