2010-08-06 49 views
8

我在测试我的HTML助手时遇到了一个问题。基本上我创建了一个包含行,列和不同类型数据的网格。在标题中还有一张图像来通知用户该数据按哪个列排序。然而,当我现在正在写我的测试(路为时已晚,但总比没有吧?!更晚),我抛出这个错误:如何在测试HtmlHelper时解决图像路径问题?

“应用程序相对虚拟路径 “〜/图片/ SortingArrowUp .png'不能 被绝对化,因为 的应用程序的路径是未知的。“

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

我怎样才能解决这个问题。我可以理解在测试过程中这可能是一个问题,并且图像可能无法使用以及所有这些,但是,那么执行此操作的正确方法是什么?

回答

13

正确的方法是致电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 - 返回一些有意义的值。

+0

很酷,我明白你的意思。如果我能够使用它,现在需要对我的帮助者做一些大的改动,而在这个阶段我不能这样做。但我现在知道将来如何去做。感谢你的回答。 – MrW 2010-08-10 14:31:33

+1

我的帮助程序不包含HttpContext属性。我有权访问该类并可以调用它的当前属性(HttpContext.Current),但是失败了,因为.GenerateContentUrl()需要一个HttpContextBase,而不是HttpContext ...这里有什么解决方案? – ekkis 2011-05-17 17:36:43

+1

@ekkis请开始一个新的问题,因为它看起来像你有不同的情况。 – marcind 2011-05-17 17:58:29

5

你可以使用此重载:

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

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

+0

“上下文”在这里指的是什么? – ekkis 2011-05-17 17:37:05

+0

目前的HttpContext – 2011-05-17 21:20:06

+0

是的,我想通了。对于其他可怜的sod,你可以得到如下的上下文:'HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current);' – ekkis 2011-05-19 05:02:46