MVC 3单元测试控制器,但GetVirtualPathData发送奇怪的VirtualPathData结果

问题描述

|| 单元测试控制器时遇到异常行为。 我正在使用一些扩展方法来构建Url.Action,并且在生产环境中运行代码时所有方法都能正常工作,但是单元测试失败。 实际上,我的自定义Url.Action帮助程序正在使用方法:   System.Web.Routing.RouteCollection.GetVirtualPathData 确切的行是:   VirtualPathData localizedpathData =   HtmlExtensions.GetVirtualPathData(newRouteTable,   Url.RequestContext,routingValues);      字符串网址=   localizedpathData.VirtualPath.ToLower(); 问题是,在对localizedpathData.VirtualPath进行单元测试时,它是一个空字符串,而不是生产代码中的路由URL。 routingValues包含三个键\“ area \”,\“ controller \”,\“ action \”,这些值与要生成url的控制器/操作的相关值有关。 奇怪的是localizedpathData.Route属性包含正确的路由!那么为什么localizedpathData.VirtualPath是一个空字符串? 我尝试使用GetVirtualPathForArea,但结果是相同的。 我正在使用MvcContrib TestControllerBuilder进行嘲笑。 示例代码在这里
    // Arrange 
var loginInput = new LoginInput { EmailAddress = \"[email protected]\",Password = \"test\",RememberMe = false };

new RouteConfigurator().RegisterRoutes(() => new ResumeAreaRegistration().Registerarea(new AreaRegistrationContext(\"Resume\",RouteTable.Routes)));

var testControllerBuilder = new TestControllerBuilder(); 
var loginController = testControllerBuilder.CreateController<LoginController>();
loginController.Url = new UrlHelper(new RequestContext(loginController.HttpContext,new RouteData()),RouteTable.Routes);
loginController.Url.RequestContext.RouteData.Values.Add(\"area\",\"Resume\");
loginController.Url.RequestContext.RouteData.Values.Add(\"culture\",\"en-US\");

const string defaultUrl = \"/Dashboard\";
// act 

var result = loginController.Index(loginInput,null);

// assert 

result.ShouldNotBeNull();
result.AssertHttpRedirect().Url.ShouldBe(defaultUrl);
也许我想念什么?我忘记了什么? 预先感谢您的帮助。     

解决方法

我在查看Reflector时发现它不起作用的原因是内部的RouteCollection对象在HttpResponseBase上调用ApplyAppPathModifier方法。解决方法是在HttpResponseBase模拟的ApplyAppPathModifier方法上设置期望值,以仅返回传递给它的值。如果您使用的是Rhino Mocks,那么它将看起来像这样:
loginController.HttpContext.Response.Stub(x => x.ApplyAppPathModifier(Arg<string>.Is.Anything)).IgnoreArguments().Do((Func<string,string>)((arg) => { return arg; }));