3 回答

TA貢獻1802條經驗 獲得超10個贊
前言
對象有幾種定義,不是真實的。一般術語是測試雙倍。這個術語包括:虛擬,假,存根,模擬。
參考
虛擬對象傳遞但從未實際使用過。通常它們僅用于填充參數列表。
假對象實際上有工作實現,但通常需要一些使它們不適合生產的快捷方式(內存數據庫就是一個很好的例子)。
存根提供了在測試期間進行的調用的固定答案,通常不會對測試中編程的任何內容做出任何響應。存根還可以記錄有關呼叫的信息,例如記住它'發送'的消息的電子郵件網關存根,或者可能只記錄它'發送'的消息。
模擬是我們在這里所討論的:預編程的對象具有預期,形成了預期接收的調用的規范。
樣式
Mocks vs Stubs =行為測試與狀態測試
原理
根據每次測試只測試一件事的原則,在一次測試中可能有幾個存根,但通常只有一個模擬。
生命周期
使用存根測試生命周期:
設置 - 準備正在測試的對象及其存根協作者。
練習 - 測試功能。
驗證狀態 - 使用斷言檢查對象的狀態。
拆解 - 清理資源。
使用模擬測試生命周期:
設置數據 - 準備正在測試的對象。
設置期望 - 準備主要對象正在使用的模擬期望。
練習 - 測試功能。
驗證期望 - 驗證是否已在mock中調用了正確的方法。
驗證狀態 - 使用斷言檢查對象的狀態。
拆解 - 清理資源。
摘要
模擬和存根測試都給出了問題的答案:結果是什么?
使用模擬測試也對以下方面感興趣:結果如何實現?

TA貢獻1906條經驗 獲得超10個贊
以下是對每個示例的描述,然后是真實世界的示例。
虛擬 - 只是虛假的價值來滿足
API
。示例:如果您正在測試一個類的方法,該類在構造函數中需要許多強制參數而對測試沒有影響,那么您可以創建虛擬對象以創建類的新實例。
假 - 創建一個可能依賴于某些外部基礎結構的類的測試實現。(這是很好的做法,你的單元測試也不要實際上外部基礎設施交互。)
示例:創建用于訪問數據庫的虛假實現,將其替換為
in-memory
集合。存根 - 覆蓋返回硬編碼值的方法,也稱為
state-based
。示例:您的測試類取決于
Calculate()
需要5分鐘才能完成的方法。您可以使用返回硬編碼值的存根替換其實際實現,而不是等待5分鐘; 只占一小部分時間。模擬 - 非常相似
Stub
但interaction-based
不是基于狀態。這意味著您不希望Mock
返回某個值,而是假設方法調用的特定順序。示例:您正在測試用戶注冊類。打電話后
Save
,應該打電話SendConfirmationEmail
。
Stubs
并且Mocks
實際上是子類型Mock
,包括交換實際實現和測試實現,但出于不同的,特定的原因。
添加回答
舉報