我在我的方法中使用HttpContext.Current.Server.MapPath()
來獲取文檔。如何爲HttpContext.Current.Server.MapPath執行單元測試
撰寫對這一方法的單元測試,
什麼我必須做的:
- 的App.config
- 在我的單元測試方法
我如何嘲笑這個?
我經受僅Current.Server.Mappath()
不是Path.Combine()
我在我的方法中使用HttpContext.Current.Server.MapPath()
來獲取文檔。如何爲HttpContext.Current.Server.MapPath執行單元測試
撰寫對這一方法的單元測試,
什麼我必須做的:
我如何嘲笑這個?
我經受僅Current.Server.Mappath()
不是Path.Combine()
這是典型的調用靜態方法的代碼,在保留關注點分離的同時進行測試非常困難,避免緊密耦合。下面是測試和模擬「不可測試代碼」的通用方法:寫一個「外觀包裝器」給它。
爲這些方法創建包裝。包含理智命名的方法,只有代表們不可測調用一個簡單的類(通常是靜態的調用)
創建於包裝類
的接口,而不是直接調用客戶端代碼不可測的方法,使用包裝(使用步驟2中提供的接口進行依賴注入)並調用其中的常規方法。
在你的單元測試中,用你想要的行爲來模擬包裝。
該方法有效地減少了耦合,並區分需要分離的問題。當然,你仍然不能測試包裝器本身的行爲,但是如果它足夠簡單(只委託原始調用),那麼它不是一個大問題。
這實際上是一個非常好的答案,但對於不知道依賴注入意味着什麼的人來說,這並不容易理解。這可能是爲什麼另一個人得到更多的讚揚...你應該提供一些簡單而簡單的代碼示例。 – Sushi271
這是我的建議:
在您的應用程序:
{...
var destinationPath= IOHelper.MapPath(DatafeedFolderName);
...
}
這是幫助方法
public static string MapPath(string subFolder)
{
return HttpContext.Current.IsNull()
? Path.Combine(Directory.GetCurrentDirectory(), subFolder)
: HttpContext.Current.Server.MapPath(subFolder);
}
而且單元測試可以使用的代碼:
{...
Assert.True(runtime_path, Directory.GetCurrentDirectory() + "\destimationPath"
...}
由於'MapPath'涉及Web服務器和文件系統,這不是一個真正的單元測試,現實中你唯一的選擇是試圖模擬HttpContext.Current - 這不是一個令人愉快的任務,也不建議...是否有一個原因,你不能改變代碼?你是單元測試的方法是什麼 - 你能解釋它的功能嗎?或許有更好的方法來構建它,這對單元測試更加有意義。 –
可能重複[單元測試Server.MapPath](http://stackoverflow.com/questions/19563106/unit-testing-for-server-mappath) – Liam
@Liam不是真的,因爲其他問題後,這個問題!所以另一個是這個東西的重複,如果有的話:)授予它是同一個人,但是短期內存損失超出了SO的範圍。 –