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