2013-05-10 93 views
0

我正在使用Moq在VS2012中寫我的第一次單元測試。單元測試 - 如何快照對象?

我需要創建一個接受多個輸入參數的對象(不是所有的都通過接口傳遞)。

爲了示例的目的,我已經最小化了代碼。這裏就是我想要做的事:

var mockLoopControl = new Mock<LoopControl>(); 
    var LoopEngine = new LoopEngine(mockLoopControl.Object); 

LoopControl對象是複雜的,有很多這是在LoopEngine構造中的部件的。

例如,LoopEngine構造函數使用loopControl.ContextData執行操作,這又是一個擁有大量成員的對象。

根據我的理解,我需要爲使用Mock.Setup()的成員分配數據。是否有可能在應用程序運行時採用loopControl.ContextData對象的快照,然後在單元測試中使用它?

我可以弄清楚如何爲這樣複雜的體系結構編寫單元測試。

我希望我讓自己清楚:)感謝您的幫助。

回答

3

你嘲笑它,所以你不需要創建那個複雜的結構。如果LoopEngine需要使用LoopControl之類的東西,也許它做得太多了?也許它應該把它的一些工作委託給LoopControl或其他對象?你可能應該提取一些其他對象並做其他事情。

所以在我看來,你似乎試圖在這裏解決一些問題。

如果你想測試更多的功能,你可能會做集成測試。那麼你可能需要有更復雜的對象結構 - 對。但是,您不一定需要使用模擬,而是在實際座標中檢查結果。

0

到handline單元測試的通用做法,這種方式是簡單地創建一個假替身對象呈現您的數據測試你想讓它,以便測試呈現類它。比你可以隔離你正在測試的類,並使用已知的值進行測試。

爲您的測試編寫快速靜態類應該比較簡單。

1

據我瞭解你的問題,你不想模擬LoopControl的數百個屬性,對吧? 由於LoopControlLoopEngine之間的緊密耦合,看起來像LoopEngine的單元測試變得棘手。你有幾種選擇在這裏

  1. 堅持嘲笑(我寧願稱之爲替代,只是不要嘲笑模擬/假的/存根術語)。
  2. 重構LoopEngine接受ILoopControl的類構造函數和實現ILoopControl的LoopControl類。這會緩解很多嘲諷。
  3. 重構LoopControl其他方式,因爲loopControl.ContextData對我來說聽起來不太好(可能的模型和控制器的混合或像這樣的smth)。通過檢查你的LoopControl類,它的目標是你可能會提取一些其他的類,這正好滿足LoopEngine初始化所需的內容(更高的一致性總是有利的)。
  4. 不要擔心任何重構和單元測試,並對LoopEngineLoopControl對執行集成測試(但任何錯誤都需要更多的調查工作)。