以前學習了單元測試的基礎知識,以及樁對象和模擬對象的不一樣做用。但在實際應用中,每每不會直接手寫樁對象或者模擬對象,而是使用隔離框架動態的建立這些對象,這可讓測試變得更簡便、快捷,還能夠更好地應對複雜的測試。這裏學習的即是隔離框架的一種——Nsubstitute。框架
一 開始使用NSubstitute單元測試
在前面有一個測試場景爲:使用LogAnalyzer.Analyze方法分析文件,若是文件名太短,就記錄日誌,爲了測試LogAnalyzer類與ILogger實現之間的交互,須要手寫一個實現了ILogger接口的模擬對象,並針對這個模擬對象進行斷言。那麼如今使用NSubstitute來進行這一過程,測試代碼只有下面幾行就能夠作到了。學習
logger就是使用NSubstitute建立的模擬對象。Substitute靜態類動態負責建立僞對象,For 方法是產生僞對象的基本方法。最後一句中的logger.Receive方法在接口中並不存在,而是被NSubstitute擴充的,用於驗證方法是否被調用。logger.Received().LogError("Filename too short:a.txt")總體的意思即是:測試logger對象是否Receive對LogError方法的調用請求,並且傳遞的參數爲"Filename too short:a.txt"。這是對模擬對象的測試方法。測試
二 設置僞對象的返回值日誌
還能夠設置方法在必定條件下的返回值對象
a) 全匹配接口
rule.IsValidLogFileName("a.txt").Returns(true),指定了當方法IsValidLogFileName()被調用且參數爲"a.txt"時返回結果爲truestring
b) 類型匹配it
rule.IsValidLogFileName(Arg.Any<string>()).Returns(true),指定了當方法IsValidLogFileName()被調用且參數爲string類型時返回結果爲true,這樣匹配的範圍會更廣,這種指定方法也最經常使用。類型匹配主要使用Arg來指定io
c) 返回異常
還能夠指定方法在必定的條件下返回何種異常,好比這兒的代碼中指定的條件爲IsValidLogFileName()被調用且參數爲string類型時,返回Exception("fake exception")。這兒的寫法與前面的有點區別,用到了lambda表達式
三 使用隔離框架的注意事項
a) 隔離框架的寫法會使代碼可讀性下降
b) 明確要驗證的對象,不要驗證錯誤的事情,也不要過分驗證
c) 儘可能少用模擬對象,一個測試中最多出現一個模擬對象,但模擬對象存在時,要針對模擬對象進行斷言
d) 不要使用樁對象來驗證交互,這是模擬對象作的事情
參考資料:
The Art of Unit Testing with examples in C#, 2nd Edition by Roy Osherove