簡體   English   中英

單元測試C#重構靜態方法

[英]Unit testing C# refactoring static methods

我有一些要進行單元測試的類(稱為A類),但是它使用了一些帶有靜態方法的類(稱為B類)。

為了使用靜態方法刪除對這些類的引用,我必須將它們重構為實例方法並注入到A類中。

問題是A類似乎依賴於很多服務(不僅B類)?

在這種情況下最好的選擇是什么? 是否有一個具有很多可以接受這些服務的參數的構造函數?

還是我的設計有問題,因為類A具有如此多的依賴關系?

謝謝

問題是A類似乎依賴於很多服務(不僅B類)?

通常有幾個依賴性表示代碼有異味。 您的課程很可能違反了單一責任原則。

嘗試將班級分成較小的班級。

單元測試是一個很好的質量指標。 難以測試的類經常違反一項或多項SOLID原則。

在這種情況下最好的選擇是什么? 是否有一個具有很多可以接受這些服務的參數的構造函數?

構造函數注入始終是首選方法,因為很容易分辨出一個類具有哪些依賴關系。

我建議構造函數注入,尤其是當您要注入大量依賴項時,僅當您使用像Unity或Ninject這樣的依賴注入框架時。 重構現有代碼庫以在各處添加構造函數注入通常很麻煩,並且可能需要將所有服務存儲在許多基類的局部變量中,以便您可以將它們傳遞給更進一步的類。

在這種情況下,我將使用ServiceLocator模式的一些實現,並使用一個靜態ServiceLocator / Container類,您可以使用該類來訪問非靜態服務:

IService _service = ServiceLocator.GetService<IService>();

這將需要在現有代碼中進行最少的重構(只需將_service.DoSomething()替換為MyService.DoSomething() _service.DoSomething() ,並且仍然可以通過替換ServiceLocator的Internet集合來模擬和測試代碼:

ServiceLocator.Register<IService>(myFakeService);

暫無
暫無

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

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