單元測試(四)-隔離框架NSubstitute

以前學習了單元測試的基礎知識,以及樁對象和模擬對象的不一樣做用。但在實際應用中,每每不會直接手寫樁對象或者模擬對象,而是使用隔離框架動態的建立這些對象,這可讓測試變得更簡便、快捷,還能夠更好地應對複雜的測試。這裏學習的即是隔離框架的一種——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

相關文章
相關標籤/搜索