【问题标题】:How to resolve issue with image path when testing HtmlHelper?测试 HtmlHelper 时如何解决图像路径问题?
【发布时间】:2011-03-26 09:43:06
【问题描述】:

我在测试 HTML Helper 时遇到了一个问题。基本上,我正在创建一个包含大量行、列和不同类型数据的网格。在标题中还有一个图像来通知用户数据是按哪一列排序的。但是,当我现在编写测试时(为时已晚,但迟到总比没有好?!),我得到了这个错误:

"应用程序相对虚拟路径 '~/Images/SortingArrowUp.png' 不能 成为绝对的,因为通往 应用程序未知。”

 var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png");

我该如何解决这个问题。我可以理解在测试期间这可能是一个问题,并且图像可能不可用等等,但是正确的方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc unit-testing html-helper virtual-path


    【解决方案1】:

    正确的方法是调用UrlHelper.GenerateContentUrl 而不是VirtualPathUtility。在您的帮助代码中,您将执行以下操作:

    MvcHtmlString MyHelper(this HtmlHelper helper, ...) {
      // other code
      var imgPath = UrlHelper.GenerateContentUrl("~/Images/SortingArrowUp.png",
                                                 helper.ViewContext.HttpContext);
      // other code
    }
    

    在进行单元测试时,您必须传入正确模拟的上下文对象。您需要模拟 HttpContext.Request.ApplicationPath - 返回一些虚拟应用程序路径,HttpContext.Response.ApplyAppPathModifier() - 什么都不做,HttpContext.Request.ServerVariables - 返回 null,HttpContext.Request.PathHttpContext.Request.RawUrl - 返回一些有意义的值。

    【讨论】:

    • 酷,我明白你的意思了。如果我应该能够使用它,现在需要对我的助手做一些大的改变,而在这个阶段我不能这样做。但我现在知道将来该怎么做。感谢您的回答。
    • 我的助手不包含 HttpContext 属性。我确实可以访问该类,并且可以将其称为当前属性(HttpContext.Current),但这失败了,因为 .GenerateContentUrl() 需要一个 HttpContextBase,而不是 HttpContext...这里的解决方案是什么?
    • @ekkis 请提出一个新问题,因为您的情况似乎有所不同。
    • @ekkis 您可以从您的 HtmlHelper 获取 HttpContextBase 的实例。例如:helper.ViewContext.HttpContext
    • @marcind 当然,如果已接受的解决方案存在问题,那么在这种情况下回应此类问题会更​​好吗?对不起,但是当人们因为语义而被发送到这里和那里时,我有点生气。他的问题是“我的助手不包含 HttpContext 属性”。答案在上一条评论中。
    【解决方案2】:

    你可以只使用这个重载:

    var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png", 
        context.Request.ApplicationPath);
    

    这是UrlHelper.GenerateContentUrl内部使用的,你只需要模拟ApplicationPath

    【讨论】:

    • 这里的“上下文”指的是什么?
    • 是的,我想通了。对于其他为此苦苦挣扎的可怜草皮,您可以获得这样的上下文:HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current);
    • 您可以从您的 HtmlHelper 获取 HttpContextBase 的实例。例如:helper.ViewContext.HttpContext
    猜你喜欢
    • 2019-05-23
    • 2019-10-24
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多