使用 Moq 測試.NET Core 應用 -- Mock 行為

solenovex發表於2018-07-14

 

第一篇文章, 關於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

本文介紹使用Moq進行行為測試.

使用的程式碼: https://github.com/solenovex/Moq4-Tutorial-Code 裡面的 04 Before 部分.

 

Mock 行為

前兩篇介紹的內容都是基於狀態的測試, 也就是程式碼執行後, 我們堅持被測試系統的狀態是否和我們期待的一致.

而本文介紹的是行為測試, 也就是說我們要確認某些方法會被執行或者某些屬性被訪問了.

 

確認方法被呼叫

建立一個新的測試方法:

與狀態測試不同, 這裡我不使用Assert, 我是用的是mock.Verify() 來判定其引數裡的方法會被執行. 在這裡也可以使用It類進行引數匹配.

該測試會通過, 表示IsHealthy確實被執行了:

 

如果我改變一下Verify裡IsHealthy()方法的引數範圍:

那麼針對此例, 測試就會失敗:

這是因為IsHealthy()方法被呼叫時的引數與我所期待的引數不一致.

 

自定義錯誤資訊

這時, 我們可以使用另一個過載版本的Verify()方法, 它可以新增一個錯誤資訊的引數:

這時測試失敗的資訊如下:

 

此外通過過載方法, 還可以判斷方法被呼叫的次數

 

方法被呼叫次數

還是用到了Verify的過載方法和Times這個struct.

1. 沒被呼叫:

2. 被呼叫1次:

3. 被呼叫特定次數:

Times這個struct裡面還有很多選項, 請自行摸索.

 

確認屬性訪問

首先是Get.

與之前呼叫的Verify()不同, 針對屬性, 需要使用VerifyGet()方法來確保屬性被訪問了:

這個測試會通過, 因為這個屬性確實被訪問了:

 

檢查另一個沒有被訪問的屬性:

那麼結果就會失敗:

 

下面是Set.

很簡單, 使用VerifySet()方法即可. 再建立一個測試方法:

在VerifySet方法裡需要設定被Set的屬性以及被Set的值.

針對此例, 這個測試會通過:

但是如果Set的值不正確, 測試就會失敗:

 

本文先到這....未完待續....

程式碼: https://github.com/solenovex/Moq4-Tutorial-Code 04 After.

 

相關文章