2009-05-04 242 views
6

我試圖學習依賴注入,並遇到單元測試應用程序時出現問題。依賴注入解決方案和單元測試

我正在寫一個控制檯應用程序,創建並在main()初始化的容器,它可作爲一個Program.Containerget-property,在我的應用程序,以便在任何地方我可以打電話Program.Container.Resolve<..>()

我有一個ServiceValidator類是這樣的:

public class ServiceValidator 
{ 
    private readonly IConfiguration _configuration; 
    private readonly IService _service; 

    public ServiceValidator(IConfiguration configuration, IService service) 
    { 
     _configuration = configuration; 
     _service = service; 
    } 

在另一大類我用

ServiceValidator serviceValidator = Program.Container.Resolve<ServiceValidator>(); 
serviceValidator.VerifyVersion(); 

這引起了我的問題,在單元測試Program.Container.Resolve通話,因爲它不已設置。

那是一個不好的做法,呼籲解決在容器上?我可以在Main()中創建ServiceValidator實例並傳遞該對象,但這似乎很愚蠢,因爲它會導致只傳遞給下一個方法的對象的很多參數。

所以我想這是可以接受的一類中調用化解,但隨後的容器必須配置爲單元測試。我應該怎麼做,我應該把容器移到另一個地方而不是Program課程嗎?你會推薦什麼?

如果它的事項,我使用的是團結和C#

感謝:-)

回答

8

這是一個不好的做法,在容器上調用解析?我可以在Main()中創建ServiceValidator實例並傳遞該對象,但這似乎很愚蠢,因爲它會導致只傳遞給下一個方法的對象的很多參數。

當您一路使用依賴注入時,則不需要將大量參數傳遞給對象。每個對象的構造函數應該只有它自己直接使用的那些依賴關係的參數 - 它不會知道它的直接依賴關係的傳遞依賴關係。

因此,如果您有一個需要ServiceValidator的類X,那麼類X將具有ServiceValidator類型的構造函數參數。那麼如果某個類Y使用類X,那麼類Y將具有類型X的構造函數參數。請注意,Y 對ServiceValidator沒有任何知識,因此您不需要將ServiceValidator從一個類傳遞到另一個類 - 唯一的地方在構建X時使用它,這通常是由DI框架完成的,或者在手寫體工廠中只有一個地方完成。

更多信息,有些鏈接:

1

我通常允許呼叫解決從容器依賴於像主要場所,雖然我還是儘量保持對它們一最小。然後我做的是在測試類的初始化方法中配置容器。我已經用任何需要調用容器的測試類對它進行初始化。

這不叫什麼需要初始化容器測試類就能夠忽略它,而不是使用假貨。我通常在這些情況下使用mock。

我也用Microsoft Service Locator,這樣,我走的是依賴是從.NET框架,而不是在特定容器的東西。這使我可以在路上使用任何我想要的東西,即使是家庭釀造的容器。

+0

我還是想看看如何解決這個問題一個很好的模式,而又不使程序類... – 2009-05-04 13:38:33

+0

的依賴>我存話費這樣的.. 你的意思是「決心」調用容器? – Karsten 2009-05-04 13:40:59

+0

是的,我的意思是'解決'呼叫集裝箱。 – 2009-05-04 14:44:05

0

你可以使用一個靜態類作爲您的容器的初始化。像BootStrapper.cs會很好。然後您可以在代碼和測試中引用類方法。

0

那麼你正在做的技術是在你的類服務的位置。

我記得讀這篇文章而回:

http://martinfowler.com/articles/injection.html

對於我的課我從來沒有試圖在他們使用的決心。當我需要它們時,我通過容器創建對象。對於單元測試,我要麼使用一些模擬庫和存根類。

0

的問題在於事實上你正試圖測試Main方法。這種方法幾乎不可能進行單元測試。

我認爲最好不要進行單元測試你的主要方法,因爲:

  • 現代單元測試的重點是關於設計
  • 你應該儘量減少在單元測試中對配置的依賴。配置可以通過煙霧或集成測試進行測試。