DotNetCore跨平(ping)臺(tai)~Moq框架實現(xian)模擬(ni)測(ce)試
當我們進行軟件開發時,一般會寫單元測試,而對于業務情景來說,一般是測試它的業務邏輯準確性,對于你的測試數據是否來自數據庫還是文件,是(shi)否為(wei)真實還是(shi)模(mo)擬,并不是(shi)很關心!我關心的就是(shi)我的業(ye)務(wu)邏輯是(shi)否正(zheng)確(que)!
所以(yi)(yi)我們的(de)單元測(ce)試(shi)在(zai)調(diao)用(yong)(yong)底層接(jie)口時(shi),尤其是(shi)(shi)數據(ju)持久層的(de)接(jie)口時(shi),一般可(ke)以(yi)(yi)使(shi)用(yong)(yong)mock的(de)方式,即模(mo)擬一個接(jie)口,期(qi)望的(de)參(can)數和(he)期(qi)望的(de)結果(guo)就(jiu)夠了,而沒有必要真正去連接(jie)數據(ju)庫,事實上,在(zai)業務測(ce)試(shi)里,使(shi)用(yong)(yong)真實的(de)數據(ju)庫沒有什么意義!無非是(shi)(shi)加大測(ce)試(shi)的(de)復(fu)雜度!
一(yi)個不(bu)錯的mock測試工具 Moq,它在nuget上已經(jing)有了正式版,大家可以下載使用(yong)

下(xia)面介紹如何使(shi)用這個(ge)工具,我們(men)(men)以一(yi)個(ge)最簡單的例(li)子來說(shuo)一(yi)下(xia),例(li)如有(you)一(yi)個(ge)接口(kou),里面一(yi)個(ge)方法,方法有(you)輸入參數和返(fan)回值,我們(men)(men)可(ke)以這樣(yang)去模擬它的實現(xian)!
一個(ge)標(biao)準的(de)接口,它的(de)實現(xian)可能是(shi)從數據庫返回一個(ge)集合,而在測試用(yong)例里,我只使用(yong)moq來干這事,你(ni)完全可以不寫它的(de)實現(xian),先進行業(ye)務(wu)代碼編寫,這就是(shi)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是否(fou)實現,我們只(zhi)關心它(ta)的(de)輸入參(can)數(shu)和返回(hui)值,只(zhi)要業務層調(diao)用它(ta)時,輸入參(can)數(shu)匹配它(ta)就可以返回(hui)遇期的(de)結(jie)果!這才是
最重要的事!

感謝各位的閱讀!
CI、CD我們(men)還在繼續!