參考文章:http://blog.csdn.net/bclz_vs/article/details/6902638
http://www.cnblogs.com/PurpleTide/archive/2011/03/31/2001366.html
http://hi.baidu.com/xiaoduo170/item/a4f79a79c8bc733e71442358
在做單元測試的時候HttpContext.Current是為null的
而有些dll是和HttpContext綁定的(很大原因是...net大部分用於web項目)
或者是試圖在windows form 或者console中使用這些dll就掛了...
當然HttpContext.Current是可以賦值的...那么最最簡單的方法就是直接new一個HttpContext給它啦
HttpRequest request = new HttpRequest("", "http://localhost", "");
HttpContext.Current = new HttpContext(request, new HttpResponse(new System.IO.StringWriter()));
最后在單元測試類中:
[TestInitialize]
public void MyTestInitialize()
{
HttpContext.Current = new HttpContext(new HttpRequest("", "http://localhost", ""),new HttpResponse(new StringWriter(new StringBuilder())));
}
· 帶有[ClassInitialize()]特性的方法在執行類中第一個測試之前調用。
· 帶有[TestInitialize()]特性的方法在執行每個測試前都會被調用,一般用來初始化環境,為單元測試配置一個特定已知的狀態。
· 帶有[ClassCleanup()]特性的方法將在類中所有的測試運行完后執行。
· 帶有[TestCleanup()]特性的方法將在每個測試運行完畢后執行,一般用來恢復環境變量到測試前的已知狀態,可能是刪除一個文件或者恢復數據庫記錄。
所以[TestInitialize()]的調用時間是在構造函數之后,TestMethod之前。
下表列出了這四個方法的解釋和用法。
| 函數名 |
用法 |
| [ClassInitialize()] MyClassInitialize |
這個方法會在每次調用測試方法前被自動調用。假設在調用AddTest(),DivideTest()等方法之前都需要初始化一些基本數據列表,則這個工作可以放在MyClassInitialize函數里面,不用分別寫在每個測試方法里。 |
| [ClassCleanup()] MyClassCleanup |
這個方法會在每次調用測試方法結束后被自動調用。 |
| [TestInitialize()] MyTestInitialize |
這個方法會在每次啟動一個測試過程前被自動調用。例如本次測試一共選擇了AddTest(),DivideTest()兩個測試方法,則在調用這兩個方法前,MyTestInitialize會先被調用。與MyClassInitialize不同的是,MyClassInitialize是每次調用測試方法時都會被調用,相當於函數級的調用,MyTestInitialize則只在測試過程前會被調用一次,在測試過程結束前,不會再被調用,相當於過程級的調用。 |
| [TestCleanup()] MyTestCleanup |
這個方法會在每次結束一個測試過程后被自動調用。
|
Visual Studio 之所謂把這四個函數注釋掉,原因是這四個函數只是示意性函數(從名字中就可以看出)。關鍵是看這四個函數的方法屬性[ClassInitialize()],[ClassCleanup()], [TestInitialize()], [TestCleanup()]只要把相關的屬性加到相關的方法上,那么這個方法就具有的上面所描述的功能。
- 為什么需要Mock 本文轉載: http://blog.csdn.net/cooleader320/article/details/1907535
- 單元測試的基本原則應該是每次只驗證一個方法,但是倘若遇到這樣一種情況:
-
測試方法依賴於其他一些難以操控的東西,如:網絡,數據庫。或者是你測試的代碼依賴於系統的其他部分,甚至是系統的多個其他部分。在這種情況下,倘若不小心,最終可能發現自己不小心幾乎初始化了系統的每一個組件,而所有這一切只是為了給某一個測試創造必要的運行環境。這不僅花費了大量的時間,要命的是這樣的測試用例會被引入大量的耦合因素,很難到達“單元”測試的目的。我們該怎么辦呢? 這是Mock的測試方法就派上用場了。Mock的英文的字面意思是:嘲笑,模仿,欺騙的意思。通過Mock,我們可以創建很多真實對象的替代品,在測試用例中使用它。
- 什么情況下考慮使用Mock
1) 真實的對象具有不可確定的行為(如:程序需要通過web service獲得股票的實時價格)2) 對象很難被創建(如系統環境很難初始化)3) 真實對象的某些行為很難被觸發(如網絡錯誤,數據庫ID自增序列溢出)4) 真實的對象令程序運行很緩慢5) 真實對象含有UI等不方便測試的因素6) 測試需要詢問真實對象是如何被調用的(如異步調用的情況,需要驗證Callbak的函數)7) 真實的對象目前還不存在(如依賴於其他項目組或則需要新的硬件系統)
