2012-06-13 60 views
1

我有问题从controller.RouteUrl(routeName)方法中检索路由URL。 这里是我在我的测试方法嘲笑网址代码:嘲笑控制器UrlHelper

//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

你应该嘲笑其上内部使用UrlHelperresponseApplyAppPathModifier方法。因此,只需在FakeHttpContext方法内添加以下行,您就可以轻松完成:

response 
    .Setup(x => x.ApplyAppPathModifier(It.IsAny<string>())) 
    .Returns<string>(x => x);