1. 程式人生 > >使用 Moq 測試.NET Core 應用 -- 其它

使用 Moq 測試.NET Core 應用 -- 其它

表達 連續 span empty ups 通過 check lin 事件綁定

第一篇文章, 關於Mock的概念介紹: https://www.cnblogs.com/cgzl/p/9294431.html

第二篇文章, 關於方法Mock的介紹: https://www.cnblogs.com/cgzl/p/9300356.html

第三篇文章, 關於屬性Mock的介紹: https://www.cnblogs.com/cgzl/p/9304567.html

第三篇文章, 關於行為Mock的介紹: https://www.cnblogs.com/cgzl/p/9306728.html

本文介紹使用Moq其它一些功能.

使用的代碼: https://github.com/solenovex/Moq4-Tutorial-Code 裏面的 05 Before 部分.

拋出異常

這裏是指讓mock對象拋出異常.

首先創建一個測試方法, 並設定球員年齡小於16歲時, IPhysicalExamination會在調用IsHealthy()方法時拋出異常:

技術分享圖片

隨後在球員審批的方法裏, 需要捕獲這個異常, 並返回相應的結果:

技術分享圖片

這個測試會通過:

技術分享圖片

上面使用的是泛型的版本來拋出異常, 也可以不使用泛型, 直接拋出異常:

技術分享圖片

Events

我們還可以讓mock對象來引起事件.

首先在IPhysicalExamination添加一個event:

技術分享圖片

每當IsHealthy()方法被調用後, 就應該引起這個event事件.

在實現類裏, 也需要加上這個event, 但是暫時不對它做任何其它動作:

技術分享圖片

在轉會審批類裏, 做這樣幾處修改:

技術分享圖片

添加一個處理事件的方法, 如果事件被觸發, 那麽PlayerHealthChecked這個標識就會變成true.

創建一個測試方法, 以判斷該event是否被觸發:

技術分享圖片

這個測試應該會失敗:

技術分享圖片

因為該event並沒有被觸發(PhysicalExamination裏並沒做什麽動作).


這時, 我們可以使用mock對象來觸發該事件, 在測試方法裏, 手動調用mock對象的Raise()方法:

技術分享圖片

第一個參數是lambda表達式, 該事件綁定到null, 第二個參數針對本例是EventArgs.Empty即可.

再測試, 就會通過:

技術分享圖片

第二種方法是在設置IsHealthy()方法的時候對事件進行觸發設定:

技術分享圖片

這樣的話只要IsHealthy()方法被調用, 那麽HealthChecked這個事件也會被觸發.

該測試也會通過:

技術分享圖片

設定連續調用的不同返回值

使用SetupSequence()方法可以為mock對象的成員在連續調用的時候每次都返回指定的值(或拋出指定的異常):

技術分享圖片

該測試執行時, 第一次調用IsHealthy()方法時, 該方法返回true, 體檢通過; 而第二次調用IsHealthy()方法時, 返回false, 體檢不通過.

這個測試是會通過的:

技術分享圖片

Mock 不實現接口的方法

首先建立一個類, 它沒有實現任何接口, 裏面有一個方法用於判斷當前是否處於轉會期:

技術分享圖片

然後在轉會審批類裏使用該類:

技術分享圖片

創建一個測試方法, mock上面的類:

技術分享圖片

但是該測試回失敗:

技術分享圖片

這是因為Moq在mock這種類的時候要求其方法必須是virtual的.

那麽修改該方法為virtual:

技術分享圖片

這樣的話測試就會通過:

技術分享圖片

Protected Virtual 方法

為上面的類再添加一個protected virtual 方法:

技術分享圖片

如果想要mock這個方法的話, 需要這樣用:

技術分享圖片

有參數的話, 需要用到ItExpr類.

Linq to Mocks

我們可以把之前寫的設定代碼使用Linq的方式來寫:

技術分享圖片

這裏要使用Mock.Of<T>()方法. 參數的lambda表達式裏面可以設定mock對象成員的返回值.

由於這種方法直接返回所需的類型, 所以在使用mock對象的時候就無需使用.Object屬性了.

該測試也會通過:

技術分享圖片

Moq的簡介就到這裏, 其實看官方文檔會更快速一些: https://github.com/Moq/moq4/wiki/Quickstart

重構後的代碼在: https://github.com/solenovex/Moq4-Tutorial-Code 裏面的05 After.

使用 Moq 測試.NET Core 應用 -- 其它