C# 测试HtmlHelper时如何解决图像路径问题?
我在测试HTML助手时遇到了一个问题。基本上,我正在创建一个包含行、列和不同类型数据的网格。在标题中还有一个图像,用于通知用户数据按哪个列排序。然而,当我现在编写测试时(太晚了,但总比没有好吧?!),我会抛出以下错误: “应用程序相对虚拟路径 “~/Images/SortingArrowUp.png”无法 成为绝对的,因为 应用程序未知。”C# 测试HtmlHelper时如何解决图像路径问题?,c#,asp.net-mvc,unit-testing,html-helper,virtual-path,C#,Asp.net Mvc,Unit Testing,Html Helper,Virtual Path,我在测试HTML助手时遇到了一个问题。基本上,我正在创建一个包含行、列和不同类型数据的网格。在标题中还有一个图像,用于通知用户数据按哪个列排序。然而,当我现在编写测试时(太晚了,但总比没有好吧?!),我会抛出以下错误: “应用程序相对虚拟路径 “~/Images/SortingArrowUp.png”无法 成为绝对的,因为 应用程序未知。” 我怎样才能解决这个问题。我可以理解在测试期间这可能是一个问题,图像可能不可用等等,但是正确的方法是什么?正确的方法是调用UrlHelper.Generate
我怎样才能解决这个问题。我可以理解在测试期间这可能是一个问题,图像可能不可用等等,但是正确的方法是什么?正确的方法是调用
UrlHelper.GenerateContentUrl
而不是virtualPath
。在助手代码中,您可以执行以下操作:
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
-返回一些有意义的值。您可以使用此重载:
var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png",
context.Request.ApplicationPath);
这就是
UrlHelper.GenerateContentUrl
在内部使用的,您只需模拟ApplicationPath
很酷,我明白您的意思。如果我能够使用它,现在就需要对我的助手做一些大的更改,但在这个阶段我做不到。但我现在知道以后怎么做了。谢谢你的回答。我的助手不包含HttpContext属性。我确实可以访问该类,并且可以调用它的当前属性(HttpContext.current),但这失败了,因为.GenerateContentUrl()需要的是HttpContextBase,而不是HttpContext。。。这里的解决方案是什么?@ekkis请开始一个新问题,因为您的情况似乎有所不同。@ekkis您可以从HtmlHelper获得HttpContextBase的实例。例如:helper.ViewContext。HttpContext@marcind当然,如果公认的解决方案存在问题,那么最好在这方面对这些问题作出回应?对不起,因为语义学的原因,当人们被送到这里或那里时,我有点恼火。他的问题是“我的助手不包含HttpContext属性”。答案在前面的评论中。这里的“上下文”指的是什么?是的,我知道了。对于其他陷入困境的糟糕的SOD,您可以获得如下上下文:HttpContextBase currentContext=new-HttpContextWrapper(HttpContext.Current)代码>您可以从HtmlHelper获取HttpContextBase的实例。例如:helper.ViewContext.HttpContext
var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png",
context.Request.ApplicationPath);