8

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

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

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

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

4

2 回答 2

15

正确的方法是调用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.Path并且HttpContext.Request.RawUrl- 返回一些有意义的值。

于 2010-08-06T23:08:49.530 回答
5

你可以只使用这个重载:

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

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

于 2010-11-17T19:50:28.953 回答