2011-09-07 44 views
0

我有一個類庫,它有一個基於模板發送電子郵件的方法。我通過訪問該模板以下幾點:Moq'ing HttpContext.Current

HttpContext.Current.Server.MapPath("email template path"); 

現在,當談到寫我的單元測試中,我希望能夠模擬出「當前上下文」,我曾嘗試使用MVCMockHelpers但「當前」屬性總是返回null。

是否有可能嘲笑這個屬性?如果是這樣,我該怎麼辦呢?

回答

3

我會考慮是否最好完全移除對HttpContext的依賴關係,並將路徑作爲字符串參數單獨傳遞到方法中。

如果你也在同一個庫中的其他地方依賴於HttpContext,那麼你需要對HttpContextBase進行依賴,而不是直接調用HttpContext。您應該在調用站點或作爲構造函數注入參數傳遞它。

創建一個模擬HttpContext已被很多其他人包括在內,其中包括Craig Stuntz的here。這至少會讓你開始,但可能需要修改你的具體測試要求。

+0

更具體地說,該類應該像路徑提供程序類一樣依賴於它,因爲它訪問靜態Current屬性的原因是調用HttpServerUtility MapPath方法。如果代碼正在訪問其他Current屬性,那麼它需要升級並抽象出HttpContext本身。 –

+0

被引用的文章創建一個假的HttpContextBase而不是一個HttpContext。 – ThomasArdal

+0

無處不在我在遺留代碼中發現了這個問題,在消費代碼中切換到使用'HttpContextBase'已經很簡單了。之後,如果你曾經使用舊的'HttpContext',你可以簡單地用'new HttpContextWrapper(someHttpContext)'包裝它,然後它將作爲'HttpContextBase'工作。也就是說,正如Daz/Sixto說的那樣,如果可以幫助的話,那麼肯定值得移除對任何類型的'HttpContext *'的依賴,以支持你需要的確切項目。 – patridge