1. ホーム
  2. asp.net-mvc

[解決済み] ASP.NET MVC: UrlHelperを使用するコントローラのユニットテスト

2022-04-23 13:23:39

質問

コントローラのアクションの1つは、Ajaxリクエストで呼び出され、リダイレクトを行うためにクライアント側にURLを返します。私は Url.RouteUrl(..) であり、ユニットテストでは Controller.Url パラメータは事前に入力されていません。

いろいろと試してみたのですが、特に UrlHelper (これは失敗)、手動で UrlHelper を持つ RequestContext を持つものは、スタブ付きの HttpContextBase (これは RouteCollection.GetUrlWithApplicationPath の呼び出し)。

Googleで検索してみましたが、この件に関するものはほとんど見つかりませんでした。私は、以下のような信じられないような愚かなことをしているのでしょうか? Url.RouteUrl をControllerアクションで使用できますか?もっと簡単な方法はないでしょうか?

さらに悪いことに、ユニットテストで返されたURLをテストできるようにしたいのです。実際、私は正しいルートにリダイレクトされていることを知りたいだけなのですが、ルートではなくURLを返しているので、解決されるURLを制御したいのです(たとえば、スタブされた RouteCollection ) - しかし、私は最初に私のテストが通過することができれば満足です。

どのように解決するのですか?

以下は、同様のケース(コントローラで Url.RouteUrl を使用)に対する私のテスト(xUnit + Moq)の1つです。

お役に立てれば幸いです。

var routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

var request = new Mock<HttpRequestBase>(MockBehavior.Strict);
request.SetupGet(x => x.ApplicationPath).Returns("/");
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute));
request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection());

var response = new Mock<HttpResponseBase>(MockBehavior.Strict);
response.Setup(x => x.ApplyAppPathModifier("/post1")).Returns("http://localhost/post1");

var context = new Mock<HttpContextBase>(MockBehavior.Strict);
context.SetupGet(x => x.Request).Returns(request.Object);
context.SetupGet(x => x.Response).Returns(response.Object);

var controller = new LinkbackController(dbF.Object);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), routes);