Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 测试HtmlHelper时如何解决图像路径问题?_C#_Asp.net Mvc_Unit Testing_Html Helper_Virtual Path - Fatal编程技术网

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

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

我在测试HTML助手时遇到了一个问题。基本上,我正在创建一个包含行、列和不同类型数据的网格。在标题中还有一个图像,用于通知用户数据按哪个列排序。然而,当我现在编写测试时(太晚了,但总比没有好吧?!),我会抛出以下错误:

“应用程序相对虚拟路径 “~/Images/SortingArrowUp.png”无法 成为绝对的,因为 应用程序未知。”


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

正确的方法是调用
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);