2009-11-08 133 views
5

好吧,所以我一直試圖最近進入IoC。但是,我一直遇到一個障礙 - 那就是我喜歡使用模擬對象。單元測試,模擬對象和ioc的最佳實踐

他們快速和無痛的設置。然而,如果我在我的代碼中使用IoC,那麼它迫使我創建我的對象的測試實現(和配置)而不是使用模擬對象(即使用moq)。

最終的結果是我最終得到了用於測試的巨大配置文件。

另外,在測試中有很多場景,我需要在測試測試的基礎上從我的課程中選出不同的行爲。通過moq對象,這非常簡單。你如何做與IoC類似的事情?

任何幫助將不勝感激。

謝謝,
邁克

+0

你能提供關於這個問題的更多信息嗎?我不明白你是如何或爲什麼有問題。也許代碼示例? – 2009-11-08 23:11:09

+0

如果你正在使用注入,你的類中的依賴通常應該注入到構造函數或屬性中 - 所以在你的測試中,你應該擁有所有需要的接縫來替換被mock注入的東西。你能詳細說明一個你正在努力的具體案例嗎? – Mathias 2009-11-08 23:15:35

+0

爲什麼你在使用IOC容器進行單元測試? – mwjackson 2012-05-03 09:12:24

回答

5

國際奧委會應該使用模擬對象更容易,更輕鬆。

幾個IoC容器框架將允許您定義預先存在的對象注入;與Moq你只是爲myMockObject.Object設置它。

編輯:用mock配置Unity的實施例:

var mockService = new Mock<IMyService>(); 
container.RegisterInstance<IMyService>(mockService.Object); 

作爲替代方案,可以只通過模擬對象進級的下測試(用於構造子注入)構造並繞過IoC容器完全在你的單元測試中。

編輯:喬希的答案是一個很好的例子。我通常會採用他的解決方案,而不是重新配置容器。

+0

不錯,展示瞭如何使用IoC進行測試。我們最終不得不將自己的IoC與Web環境中的WCSF一起使用。這非常容易做到,並且最終成爲理解依賴注入和IoC模式的極好練習。 – Josh 2009-11-08 23:31:11

3

我愛的IoC,我愛我一些Mock對象...

沒有與這兩個沒有衝突。如果您正在進行任何類型的依賴注入,那麼您應該只需使用您最喜歡的模擬框架創建模擬對象,然後將它們傳遞給SUT。

[Test] 
public void AnAwesomeTest() 
{ 
    IDependencyOne d1 = MyMocker.Create<IDependencyOne>(); 
    IDependencyTwo d2 = MyMocker.Create<IDependencyTwo>(); 

    //Constructor injection 
    SUT sut = new SUT(d1); 

    //Property Injection 
    sut.DependantProperty = d2; 

    //Do some stuff and Assert 
} 
+0

+1。請注意,它將是Moq的「新SUT(d1.Object)」。 – TrueWill 2009-11-08 23:26:04

+0

有趣。我習慣了RhinoMocks自己...如果語法不能解決這個問題。 – Josh 2009-11-08 23:27:48

+0

@Josh:一個區別是d1和d2的類型是Mock 。 Downside不得不做,以獲取界面,上漲可以直接設定對d1和d2的預期。這是值得比較/對比的圖書館;他們有不同的哲學。前段時間我從Rhino轉到Moq。 – TrueWill 2009-11-09 03:11:25