2011-07-13 119 views
0
public SupportedBrowser GetBrowser() 
    { 
     string agent = HttpContext.Current.Request.Headers["User-Agent"]; 

     if (agent.Contains("iPad")) 
     { 
      return new iPad(); 
     } 
     else 
      return new InternetExplorer7(); 
    } 

我使用Microsofts單元測試工具(MS-Test?)爲上述方法設置單元測試。因爲單元測試不是一個網站,所以沒有HttpContext。我可以想到兩種解決方案:使用HttpContext的單元測試方法

A.添加一個可選的參數:GetBrowser(bool debug = false)。這允許當前代碼在不重構的情況下執行。然後修改該方法以在調試爲真時創建模擬上下文或硬編碼的用戶代理。

B.添加依賴注入。從其他地方獲取上下文。儘管如此,我認爲我需要通過ninject放棄IoC來實現自動化。這是很多工作。

你能想出更好的東西或改進這些想法嗎?

請注意,此方法位於類庫中。我想保持這種方式。

回答

2

您的代理字符串是嘲笑的自然場所。而不是從此方法內的請求上下文中獲取代理程序字符串,請將其傳遞或注入方法/類。這樣你就可以在測試和運行時控制它。

+0

用於提倡DI(依賴注入)的+1 – Nauman

+0

我喜歡DI,但正如我在我的問題中發佈的,我認爲這將會有相當多的工作。由於HttpContext.Request.UserAgent是隻讀的,我不能設置測試。我可能需要全力以赴使用類似於mallows98的答案這裏http://stackoverflow.com/questions/1452418/how-do-i-mock-the-httpcontext-in-asp-net-mvc-using-moq。試圖避免這種路線。 –

+1

不要注入上下文,注入代理字符串。這會讓你完全控制它。 –