1

controller.RouteUrl(routeName)メソッドからルートURLを取得する際に問題が発生しました。テストメソッドでURLをモックするためのコードは次のとおりです。

//Arrange
...
//Mock routes
var routes = RouteTable.Routes;

routes.Clear();
routes.MapRoute(
    "AdminPaymentResult",      // Route name
    "Payment/Result");         // URL with parameters

routes.MapRoute(
    "AdminPaymentCancel",      // Route name
    "Payment/Cancel");         // URL with parameters

_controller.SetFakeUrlHelper(routes);
...

ここで、メソッドSetFakeUrlHelperは次のように定義されています。

public static void SetFakeUrlHelper(this Controller controller, RouteCollection routes)
{
    var fakeHttpContext = FakeHttpContext();
    var requestContext = new RequestContext(fakeHttpContext, new RouteData());
    controller.Url = new UrlHelper(requestContext, routes);
}

FakeHttpContextメソッドは次のように定義されます。

public static HttpContextBase FakeHttpContext()
{
    var request = new Mock<HttpRequestBase>();
    var response = new Mock<HttpResponseBase>();
    var session = new Mock<HttpSessionStateBase>();
    var server = new Mock<HttpServerUtilityBase>();

    var context = new Mock<HttpContextBase>();

    context.Setup(ctx => ctx.Request).Returns(request.Object);
    context.Setup(ctx => ctx.Response).Returns(response.Object);
    context.Setup(ctx => ctx.Session).Returns(session.Object);
    context.Setup(ctx => ctx.Server).Returns(server.Object);

    return context.Object;
}

問題は、コントローラーアクションで呼び出すときに

public ActionResult MyAction()
{
    ...
    var callBackUrl = Url.RouteUrl("AdminPaymentResult");
    ...
}

期待どおりに「支払い/結果」の代わりに空の文字列が表示されます...よろしくお願いします

4

1 に答える 1

3

によって内部的に使用されるのApplyAppPathModifierメソッドをモックする必要があります。したがって、メソッド内に次の行を追加するだけで、準備完了です。responseUrlHelperFakeHttpContext

response
    .Setup(x => x.ApplyAppPathModifier(It.IsAny<string>()))
    .Returns<string>(x => x);
于 2012-06-13T09:38:39.220 に答える