测试HtmlHelper时如何解决图像路径问题?

时间:2010-08-06 15:13:59

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

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

  

“应用程序相对虚拟路径   '〜/ Images / SortingArrowUp.png'不能   是绝对的,因为通往   该申请未知。“

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

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

2 个答案:

答案 0 :(得分: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.PathHttpContext.Request.RawUrl - 返回一些值有道理。

答案 1 :(得分:5)

你可以使用这个重载:

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

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