【发布时间】:2011-09-02 11:34:11
【问题描述】:
我在单元测试控制器时遇到了一个奇怪的行为。 我正在使用一些扩展方法来构建 Url.Action,并且在生产中运行代码但单元测试失败时一切正常。 事实上,我的自定义 Url.Action 助手正在使用该方法:
System.Web.Routing.RouteCollection.GetVirtualPathData
确切的行是:
虚拟路径数据本地化路径数据 = HtmlExtensions.GetVirtualPathData(newRouteTable, Url.RequestContext, routingValues);
字符串网址 = 本地化PathData.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);
也许我错过了什么?我忘记了什么?
提前感谢您的帮助。
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3 routing asp.net-mvc-routing