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

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

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

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

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

正确的方法是调用UrlHelper.GenerateContentUrl而不是VirtualPathUtility 。 在您的帮助程序代码中,您将执行以下操作:

 MvcHtmlString MyHelper(this HtmlHelper helper, ...) { // other code var imgPath = UrlHelper.GenerateContentUrl("~/Images/SortingArrowUp.png", helper.ViewContext.HttpContext); // other code } 

unit testing时,您必须传入正确的模拟上下文对象。 你需要模拟HttpContext.Request.ApplicationPath – 返回一些虚拟应用程序路径, HttpContext.Response.ApplyAppPathModifier() – 什么也不做, HttpContext.Request.ServerVariables – 返回null, HttpContext.Request.PathHttpContext.Request.RawUrl – 返回一些有意义的价值。

你可以使用这个重载:

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

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