![](/img/trans.png)
[英]Unit Testing Static Methods with ILogger in C# ILoggerFactory is Null
[英]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.