[英]Unit testing - how to snapshot an object?
我正在使用Moq在VS2012中編寫我的第一個單元測試。
我需要創建一個接受多個輸入參數的對象(並非所有輸入參數都通過接口傳遞)。
為了示例起見,我將代碼最小化了。 這是我想做的事情:
var mockLoopControl = new Mock<LoopControl>();
var LoopEngine = new LoopEngine(mockLoopControl.Object);
LoopControl
對象很復雜,具有很多在LoopEngine
構造函數中使用的成員。
例如, LoopEngine
構造函數使用loopControl.ContextData
執行操作, loopControl.ContextData
又是一個具有很多成員的對象。
據我了解,我需要將數據分配給使用Mock.Setup()
的成員。 例如,是否可以在應用程序運行時loopControl.ContextData
對象的快照,然后在我的單元測試中使用它?
我可以弄清楚如何為如此復雜的體系結構編寫單元測試。
我希望我能說清楚:)感謝您的幫助。
擔
您可以對其進行模擬,因此無需創建該復雜結構。 如果LoopEngine
需要使用LoopControl
某些功能,也許它做了很多事情? 也許應該將其某些工作委托給LoopControl
或其他對象? 您可能應該提取其他一些對象並做其他事情。
因此在我看來,您似乎正在嘗試解決錯誤的問題。
而且,如果您想測試更多功能,則可能要進行集成測試。 然后,您可能需要具有更復雜的對象結構-對。 但是,您不必一定要使用模擬,而要在真實的場景中檢查結果。
據我了解您的問題,您不想模擬LoopControl
數百個屬性,對嗎? 似乎由於LoopControl
和LoopEngine
之間的緊密耦合,您對LoopEngine
單元測試變得棘手。 您在這里有幾種選擇
LoopEngine
類構造函數以接受ILoopControl和LoopControl
類來實現ILoopControl。 這樣會大大簡化嘲笑。 LoopControl
其他方式重構LoopControl
,因為loopControl.ContextData
聽起來對我不好(可能是模型和控制器的混合,或者像這樣)。 通過回顧您的LoopControl
類,它的目標可能是提取一些其他類,該類完全滿足LoopEngine
初始化的需要(更高的LoopEngine
總是一個加號)。 LoopControl
對LoopEngine
和LoopControl
對進行集成測試(但是任何錯誤都需要更多的調查工作)。 以這種方式進行手工單元測試的一種常見方法是,簡單地創建一個偽造的替代對象,該對象將要測試的類與要呈現的數據一起呈現給您正在測試的類,以便對其進行測試。 比您可以隔離要測試的類,然后使用已知值對其進行測試。
編寫對您的測試“備用”的快速靜態類應該相對簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.