2010-06-30 66 views
11

使用舊代碼並嘗試創建測試時,我經常從類或方法中分離出依賴關係,因此我可以使用mock編寫這些依賴關係的單元測試。依賴關係通常以調用靜態類和對象的形式出現,這些靜態類和對象是使用構造函數中的new關鍵字或該類中的其他位置創建的。最簡單,最快的方式來打破類的所有依賴關係

在大多數情況下,靜態調用是通過包裝靜態依賴來處理的,或者如果它的一個單例模式(或類似的)以StaticClass.Current.MethodCall()的形式傳遞該依賴, 。

在大多數情況下,構造函數中new關鍵字的使用僅僅是通過在構造函數中傳遞該接口來替換。

在大多數情況下,在類的其他部分使用new關鍵字,可以通過與上面相同的方法處理,或者在需要時創建工廠,並在構造函數中傳遞工廠接口。

我總是使用Resharpers重構工具來幫助我解決所有這些問題,但大多數情況仍然是手工勞動(可能是自動化的),對於一些遺留類和方法來說,這可能是一個非常單調乏味的過程。有沒有其他的重構插件和/或工具可以幫助我在這個過程中?是否有「通過單擊」突破這個類的所有依賴性?「重構工具? =)

對我來說,聽起來像所有這些步驟是很多開發人員和常見問題的常見問題,並且在我嘗試將插件寫入Resharper或CodeRush之前,我不得不問,因爲有人可能已經嘗試過這種方法。

新增:

在反射到下面的答案:即使你可能不希望打破眼前的一幕(點擊總量突破了可能會導致更多的問題比它幫助)仍然能夠簡單地打出來1個方法依賴關係,或者1-2個依賴關係很容易,會有很大的不同。

此外,重構代碼有一個「嘗試看看會發生什麼事情,只是爲了學習如何將所有東西放在一起」,並且一次點擊就可以幫助處理噸,即使你不檢查代碼。

+0

除了下面提到的遺留代碼現在的經典工作方式,您可能會發現.NET中的Brownfield應用程序開發有趣:http://www.manning.com/baley/ – AakashM 2010-06-30 14:49:53

回答

3

我不認爲有任何工具可以自動執行此操作。使用遺留代碼意味着 - 一如你所知 - 一次只用很少的步驟更改代碼。這些步驟通常故意很小以防止出現錯誤。通常,你應該做的第一項改變是使代碼可測試的改變。在您編寫測試之後,您可以通過修復該錯誤或實現RFC的方式來更改該部分代碼。

因爲你應該採取一些小步驟,我相信很難使用重構工具來神奇地讓你所有的依賴消失。對於遺留系統,您幾乎不希望立即做出重大更改,因爲破壞(而不是因爲缺少測試而發現)的風險太大。然而,這並不意味着重構工具在這種情況下沒有用處。反之;他們幫助很大。

如果你還沒有,我建議你閱讀邁克爾羽毛的書Working Effectively with Legacy Code。它詳細描述了一系列幫助您將遺留代碼重構爲更可測試系統的模式。

祝你好運。

+0

我實際上即將閱讀那本書!在你的回答中有很多真相,所以+!儘管你可能不想一下子把所有東西都分解出來(一次點擊就可能導致更多的問題,而不是它的幫助),但仍然能夠簡單地分解1個方法依賴關係或者1-2個依賴關係差別很大。 此外,重構代碼有一個「嘗試看看發生了什麼只是爲了學習如何將所有東西放在一起」的措施,並且一次點擊總計突破將幫助處理噸,即使你不檢查代碼。 – MatteS 2010-06-30 14:44:58

+0

有現在閱讀這本書,我仍然會發現這樣一個工具很有用,儘管我可能不想檢查代碼。但是簡單地概述一下現有的依賴關係是非常有用的。每個方法,每個類,或任何我需要更改的代碼部分,從而編寫測試。此外,閱讀這本書也給了我很多關於這個工具如何真正可以幫助用可選方法實際分解依賴關係的想法.. – MatteS 2011-05-24 08:50:06

+0

@MatteS:看看NDepend。它允許您可視化系統各部分之間的依賴關係。 – Steven 2011-05-24 11:19:00

1

說到靜態調用依賴關係,您可能需要檢出Moles。它能夠在運行時進行代碼注入,以便用您自己的測試實現去除任何靜態或非虛擬方法調用。這對於測試未使用可測試依賴注入接口設計的遺留代碼來說非常方便。

相關問題