"回到目錄" Mock在單元測試里的意義 Mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以 便測試的測試方法。 一個鬧鐘 根據時間來進行提醒服務,如果過了 下午5點鐘 就播放音頻文件 提醒大家下班了,如果我們要利用真實的對象來測試的話就只能苦苦等到下午五 ...
Mock在單元測試里的意義
Mock測試就是在測試過程中,對於某些不容易構造或者不容易獲取的對象,用一個虛擬的對象來創建以
便測試的測試方法。一個鬧鐘根據時間來進行提醒服務,如果過了下午5點鐘就播放音頻文件
提醒大家下班了,如果我們要利用真實的對象來測試的話就只能苦苦等到下午五點,然後把耳朵放在音箱
旁,我們應該利用mock對象[1] 來進行測試,這樣我們就可以模擬控制時間了,而不用苦苦等待時鐘轉
到下午5點鐘了。
為什麼要用Mock
- 模擬介面的方法實現,方便測試,不需要額外建立新的類型
- 對集成測試很有必要
- 體現了面向介面編程的重要性和必要性
一般將數據層進行Mock,通過對數據的模擬,來實現業務的準確性
輸入參數和預期結果
我們可以定義兩個對象,輸入參數是我們給測試方法傳遞的原始數據,它通過計算邏輯生產新的結果;
而預期結果是我們從真實環境中通過輸入參數產生的正式結果;在經過mock測試之後,我們把真實的預
期結果和測試產生的結果進行對比,這樣可以驗證業務邏輯的正確性!使用方法
//註冊一個mock對象,並重寫它的方法GetClosing,偽造它的返回結果 _report_CashFlowDao = new Mock<IReport_CashFlowDao>(); _report_CashFlowDao.Setup(p => p.GetClosing(270, new DateTime(2017, 10, 31))).Returns(() => { return _sheetReportList; });
下麵業務層方法依賴於它,通過構造方法把它註入進來
_cashFlowService = new CashFlowService(_report_CashFlowDao.Object); _cashFlowService.HandleOrder(1139);
通過上面代碼我們完成的一個業務場景的mock過程,並最終調用了它的HandlerOrder方法,在這裡我們與
資料庫交互的IReport_CashFlowDao對象是被模擬出來的,我們可以為它提供多份模擬數據,以便更客觀
的測試結果的正確性!
待續……
回到目錄