2010-08-06 68 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