2011-04-21 37 views
2

我正在構建一個Prism 4應用程序,並使用ServiceLocator來實例化對象。 ServiceLocator正在導致單元測試問題,這導致我懷疑是否應該回去將IoC容器注入到每個需要它的類中。帶有服務定位器的單元測試棱鏡?

這裏是從庫基類問題的例子:

protected RepositoryBase(string filePath, Type contextType, string edmName) 
{ 
    m_Logger = ServiceLocator.Current.GetInstance<ILoggerFacade>(); 

    // Log invocation 
    m_Logger.Log("RepositoryBase constructor invoked.", Category.Info, Priority.None); 

    // Create object context 
    ... 

    // Log completion 
    m_Logger.Log("RepositoryBase constructor completed.", Category.Info, Priority.None); 
} 

我創建單元測試我的倉庫,我已經發現ServiceLocator不工作,大概是因爲棱鏡ISN」 t初始化爲我的測試。

可以在測試環境中使用ServiceLocator嗎?我是否可以放棄它並直接返回注入IoC容器?由於服務定位器似乎普遍失寵,我最好不要使用它嗎?謝謝你的幫助。

+0

事實證明,我偶然發現了一種反模式 - 其實就是其中的一種。注入容器可能不是一個好主意。 Se this thread:http://stackoverflow.com/questions/5761167/mocking-an-ioc-container – 2011-04-29 17:33:15

回答

4

您需要創建一個模擬IServiceLocator,在您的測試中用您的模擬提供程序初始化服務定位器。

這應該做到這一點。

0

我能夠成功測試Prism + Silverlight 4應用程序,並且無法想象爲什麼您不能在單元測試中使用ServiceLocator。您需要確保棱鏡在您的代碼的[TestInitialize]部分中正確初始化。

+0

謝謝 - 我將如何去初始化[TestInitialize]中的棱鏡? – 2011-04-21 19:43:46

+0

我想我已經明白了 - 使用與App.xaml中相同的初始化代碼。實例化引導程序並運行它。 – 2011-04-21 19:58:20

+0

不,這不起作用。 – 2011-04-21 20:18:35