Unit Test單元測試時如何模擬HttpContext


參考文章: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)         真實的對象目前還不存在(如依賴於其他項目組或則需要新的硬件系統)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM