【问题标题】:MVC 3 unit testing controller but GetVirtualPathData sends strange VirtualPathData resultsMVC 3 单元测试控制器,但 GetVirtualPathData 发送奇怪的 VirtualPathData 结果
【发布时间】: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


    【解决方案1】:

    我在使用 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; }));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 1970-01-01
      • 2014-04-13
      相关资源
      最近更新 更多