2009-02-11 93 views
0

我需要測試一個屬於某個服務類的方法。這個服務類在構造函數中有幾個依賴項,有些使用這個方法,有些則不是。如果我們不應該爲我們的單元測試使用DI容器,那麼實例化服務類的最佳方式是什麼?實例化一個測試類

var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2(), etc.); 

這很難讀,似乎很多代碼只是爲了測試一種方法。當一些依賴關係具有自己的依賴關係時,事情會變得非常混亂。

+0

@tvanfosson:我喜歡我的版本的標題更好,其實;-) – mghie 2009-02-11 21:00:01

+0

我要修復它,但我敢肯定,我嘗試它的那一刻相同的競爭條件將instaniate本身擾亂了標題再次。 – 2009-02-11 21:01:42

回答

2

你真的應該看看使用模擬框架來隔離你的測試與實際的依賴對象。我假設你使用C#(來自var關鍵字),所以我將以RhinoMock爲例。

var respository1 = MockRepository.GenerateMock<Repository1>(); 
repository1.Expect(r => r.SomeMethod()).Return(someValue); 

var repository2 = MockRepository.GenerateMock<Repository2>(); 
repository2.Expect(r => r.Method2()).Return(someValue); 

... 

var service = new Service(repository1, repository2, ...); 

repository1.VerifyAllExpectations(); 
repository2.VerifyAllExpectations(); 

使用這種機制可以控制模擬對象如何測試迴應你的等級和你相關的依賴隔離測試代碼。您還可以通過驗證您設置的期望已被滿足(稱爲)來測試您的課程是否與它所依賴的課程正確交互。

至於構造函數中的參數個數,可以考慮提供一個默認的構造函數,它不需要任何參數並且具有公共設置的依賴關係。然後,您可以使用C#3.0中的便利機制來定義它們。

var service = new Service { 
    Repository1 = repository1, 
    Repository2 = repository2, 
    ... 
}; 
2

有時候(尤其是如果它是測試代碼)有點代碼格式化的可以做的伎倆更。雖然

var service = new ServiceClass(new Repository1(), new Repository2(), new ServiceClass2()); 

肯定是難以閱讀,這一點:

var service = new ServiceClass(
    new Repository1(), 
    new Repository2(), 
    new ServiceClass2() 
); 

似乎有點更好(至少對我來說)。