5

我目前正在使用Castle Windsor 2.1版作爲我的容器,並且希望使用註冊的服務執行集成測試。NUnit集成測試和依賴項注入

目前,我做到這一點我使用Common Service Locator取回我的服務實例,並對其執行我的集成測試這樣:

var myService = ServiceLocator.Current.GetInstance<IMyService>(); 
// do stuff with myService 

我會非常喜歡做的是有我的服務依賴注入我的NUnit測試夾具自動。春天似乎提供this functionality,但我找不到任何類似的使用城堡。

任何人都可以指向正確的方向嗎?

編輯:

我敢肯定,每個人都有這是否是一個好想法(有效)點;讓我們假設它是在這種情況下...誰能告訴我這個可以使用溫莎完成

+0

所需要的單元測試你的服務的更多信息?你有沒有嘗試過使用像Moq,RhinoMocks或NMock這樣的模擬框架?如果您真的在測試組件和服務之間的*集成*,那麼只需根據需要創建儘可能多的Castle配置文件,然後使用XmlConfigurator將其加載到純文本或自定義Castle容器中。 – 2010-10-14 14:09:03

+2

@johnny g:正在執行INTEGRATION測試;這意味着我不想利用嘲笑,但實際的服務以及他們所有的實際依賴。正如你所建議的那樣,我在我的單元測試裝置中使用模擬。 – DanP 2010-10-14 14:23:38

+0

eep!這是尷尬 - 讀NUnit,突然「看到」單元測試無處不在,當你清楚地明確你的整合:) – 2010-10-14 14:54:05

回答

5

如果你從Spring/Spring.net來到Windsor,你會發現這些項目有很多不同意的地方。這是其中之一。作爲Windsor的倡導者,我永遠不會使用像Spring的AbstractDependencyInjectionSpringContextTests這樣的東西。將測試注入測試似乎是錯誤的,但是再一次,就像我說的,我有偏見。

如果你想要做一個集成測試,只需要創建一個新的容器實例,添加任何你需要的組件,以及任何你想試運行,如:

[Test] 
public void TestComponentThatDependsOnA() { 
    var container = new WindsorContainer(); 
    container.Register(Component.For<MyComponentA>()); 
    container.Register(Component.For<ComponentThatDependsOnA>()); 
    var a = container.Resolve<ComponentThatDependsOnA>(); 
    var result = a.DoSomething(); 
    Assert.AreEqual("ok", result); 
} 

如果您已經註冊整齊地裹在installers(如你所見),你可以在你的測試中重用它們,使得測試更加簡潔。

如果您有XML配置,您可以使用Configuration.FromXmlFile()輕鬆加載它。

另外,這裏不需要使用Common Service Locator。

對於某些集成測試還有一個auto-mocking container,它會自動模擬出服務(除非你用具體的服務覆蓋它們)。

+1

感謝您的意見;當您按照您的建議加載集成測試夾具時,我正在使用安裝程序連接所有依賴項。我實際上是在一個單獨的程序集中執行所有這些,所以集成測試實際上並不知道windsor正在管理所有這些(因此使用通用服務定位器來檢索我的依賴)。我認爲可能會認爲我對這種方法很懶惰,但是我的依賴關係圖非常複雜,所以這是我能想到的爲我的集成測試夾具消除大量設置工作的唯一可行方法。 – DanP 2010-10-14 15:55:10

+0

僅供參考,我沿着這些線使用了一些東西來連接我的依賴項:http://fabiomaulo.blogspot.com/2009/11/guywire.html – DanP 2010-10-14 16:25:26

0

我想你也可以用Castle來做到這一點。溫莎安裝程序是一個通用接口,可用於初始化您的容器/寄存器組件。然後,您可以根據需要根據應用程序的執行環境多次實現此界面。 您可以讓一個安裝程序在生產環境中注入實際對象,另一個安裝程序注入模擬對象/測試雙工以進行集成測試。

你可以找到http://docs.castleproject.org/Windsor.Installers.ashx