如何解决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 = \"test@test.fr\",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; }));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。