2016-01-12 114 views
1

我有一些遺留代碼訪問我們的數據庫。我想爲單元測試中的IoC/DI的每個類創建一個接口。C#:單元測試靜態類的DI

這些類中的所有方法都是靜態的。

當我嘗試通過VisualStudio「提取一個接口」時,它失敗並且說「無法提取接口:該類型不包含任何可以提取到接口的成員」。

有一些鏈接可以解釋爲什麼接口不應該有靜態方法herehere

這個限制似乎主要是爲了支持多態性......我現在並不真正在意這些類,它們並不真正從任何東西(除了Object)繼承。

那麼,如何使用IoC來獲取我可以從中提取數據的對象?

我寧願不製作實例方法,因爲實例增加了工作集。

+3

你不能「注入」靜態類 - 它們在編譯時綁定。如果你想使用注入,你必須注入實例。我建議克服你對「增加工作集」的恐懼,並處理這個問題,當它成爲問題時。 –

+1

*「多態性[我]現在並不在乎。」*是的,你這樣做,因爲你會*想爲單元測試中的IoC/DI的每個類創建一個接口。「* –

回答

3

一種技術可能是用包裝器將靜態類抽象掉。

public MyStaticWrapper : IMyStaticWrapper 
{ 
    public void SomeMethod(string something) 
    { 
     MyStatic.SomeMethod(something); 
    } 
} 

然後你可以在需要的地方注入IStaticWrapper


對不起 - 只是看到了這一點....

我寧願不作實例方法,因爲實例增加 工作集。

我不確定它是否能夠滿足這個要求,但是變化的影響是相對較小的IMO。我個人同意@DStanleys的評論。

+0

顯然靜態類被高估了,因爲它們不會非常大地減少佔用空間。 http://stackoverflow.com/questions/241339/when-to-use-static-classes-in-c-sharp – micahhoover

1

根據目標,您可以使用Microsoft Fakes之類的東西,尤其是shims來攔截靜態調用以將遺留代碼置於測試工具之下。

一旦你的圖書館被測試覆蓋,你可以把這些作爲安全網,當你引入適當的DI,如果需要的話去掉靜態圖和完全隔離的測試。

危險在於墊片是邪惡的,可以讓開發者擺脫不良做法。