簡體   English   中英

單元測試-如何對對象進行快照?

[英]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數百個屬性,對嗎? 似乎由於LoopControlLoopEngine之間的緊密耦合,您對LoopEngine單元測試變得棘手。 您在這里有幾種選擇

  1. 繼續進行模擬(我更喜歡稱其為替代,只是不要弄亂模擬/偽造/存根術語)。
  2. 重構LoopEngine類構造函數以接受ILoopControl和LoopControl類來實現ILoopControl。 這樣會大大簡化嘲笑。
  3. LoopControl其他方式重構LoopControl ,因為loopControl.ContextData聽起來對我不好(可能是模型和控制器的混合,或者像這樣)。 通過回顧您的LoopControl類,它的目標可能是提取一些其他類,該類完全滿足LoopEngine初始化的需要(更高的LoopEngine總是一個加號)。
  4. 不要費心任何重構和單元測試,也LoopControlLoopEngineLoopControl對進行集成測試(但是任何錯誤都需要更多的調查工作)。

以這種方式進行手工單元測試的一種常見方法是,簡單地創建一個偽造的替代對象,該對象將要測試的類與要呈現的數據一起呈現給您正在測試的類,以便對其進行測試。 比您可以隔離要測試的類,然后使用已知值對其進行測試。

編寫對您的測試“備用”的快速靜態類應該相對簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM