回到目錄 當我們進行軟體開發時,一般會寫單元測試,而對於業務情景來說,一般是測試它的業務邏輯準確性,對於你的測試數據是否來自資料庫還是文件,是否為真實還是模擬,並不是很關心!我關心的就是我的業務邏輯是否正確! 所以我們的單元測試在調用底層介面時,尤其是數據持久層的介面時,一般可以使用mock的方式, ...
當我們進行軟體開發時,一般會寫單元測試,而對於業務情景來說,一般是測試它的業務邏輯準確性,對於你的測試數據是否來自資料庫還是文件,是否為真實還是模擬,並不是很關心!我關心的就是我的業務邏輯是否正確!
所以我們的單元測試在調用底層介面時,尤其是數據持久層的介面時,一般可以使用mock的方式,即模擬一個介面,期望的參數和期望的結果就夠了,而沒有必要真正去連接資料庫,事實上,在業務測試里,使用真實的資料庫沒有什麼意義!無非是加大測試的複雜度!
一個不錯的mock測試工具 Moq,它在nuget上已經有了正式版,大家可以下載使用
下麵介紹如何使用這個工具,我們以一個最簡單的例子來說一下,例如有一個介面,裡面一個方法,方法有輸入參數和返回值,我們可以這樣去模擬它的實現!
一個標準的介面,它的實現可能是從資料庫返回一個集合,而在測試用例里,我只使用moq來乾這事,你完全可以不寫它的實現,先進行業務代碼編寫,這就是TDD!
public interface IReport_BalanceStatementDao { IEnumerable<BalanceSheetReport> GetClosingBalance(int companyId, DateTime relateDate); }
測試用例可以這樣去設計
_report_BalanceStatementDao = new Moq.Mock<IReport_BalanceStatementDao>(); _report_BalanceStatementDao.Setup(p => p.GetClosingBalance(270, new DateTime(2017, 10, 31))).Returns(() => { return _balanceSheetReportList; }); _report_BalanceStatementDao.Setup(p => p.GetClosingBalance(270, new DateTime(2017, 9, 30))).Returns(() => { return _balanceSheetReportList; }); _balanceStatementService = new BalanceStatementService(_report_BalanceStatementDao.Object);
運行你的測試用例,我們事實上並不GetClosingBalance是否實現,我們只關心它的輸入參數和返回值,只要業務層調用它時,輸入參數匹配它就可以返回遇期的結果!這才是
最重要的事!
感謝各位的閱讀!
CI、CD我們還在繼續!