2013-08-26 47 views
3

我有一個單元測試項目及其自己的app.config文件,它是由正在測試的目標項目定義的真實配置文件的模擬。這個模擬文件是由單元測試代碼(不是通過目標項目)加載和處理的,如果我只在這個測試項目中運行測試,它就能正常工作。ConfigurationManager.GetSection(sectionName)在執行單元測試時返回空值

ConfigurationManager.GetSection(sectionName) 

但是,如果我從幾個測試項目,以及其他測試項目運行測試相關項目進行之前,上述語句返回null。如果先討論測試項目,則加載配置文件沒有問題。

如何修復單元測試中配置文件的加載以正確工作?

+0

我面臨着類似的問題與測試項目和SQLite每次運行測試項目一個新的Sqlite數據庫被創建並且主項目沒有發生,所以爲了測試我必須創建正常的控制檯應用程序而不是測試項目。 我不知道這些信息是否有幫助某些情況下測試項目不太好尤其是當涉及到處理外部資源什麼讓我更加奇怪,我面臨與視覺2010這個問題,但是當我升級到2012年一切工作就好! – thealghabban

+0

我認爲你只能有一個活動的配置文件,第一個是用於所有項目的配置文件,當你有正常的項目,但在測試項目中不是這樣,所以將web配置複製(合併)到所有項目,看看它是否有效。 –

+0

因此,您在一個單元測試項目中有一個app.config,其他單元測試項目依賴於該app.config?這不是非常可持續的。我會建議複製該模擬app.config到每個測試項目或使用下面的@Ouarzy模擬建議。這也取決於你正在測試的是:ConfigurationManager.GetSection()調用還是別的。 –

回答

7

你的問題不是ConfigurationManager.GetSection(sectionName)返回null,它是我如何測試一些包含ConfigurationManager.GetSection(sectionName)的代碼?

答案是:包裝它,注入它,然後爲你的測試嘲笑它。

你面臨着同樣的問題生民的幾個例子:

(第二個是更詳細的,還是這個想法是一樣的)。

無論如何,這是非常合乎邏輯的,你不能在單元測試中使用來自app.config的信息,因爲app.config是整個應用程序的上下文,當它需要編寫完全獨立的測試時。如果您直接使用app.config值,那麼您有非邏輯耦合。

+0

這一切都很好,但如果你想測試的是接觸配置管理器的代碼呢?我在這種情況下,我發現所有的建議,我應該只是從我的測試中抽象出ConfigurationManager,但如果我這樣做,那麼沒有什麼可測試的。 – Casey

+0

如果您在抽象ConfigurationManager時沒有什麼可測試的東西,它向我建議您需要重構以實現更好的響應性隔離。 – Ouarzy

+0

您比使用ConfigurationManager獲取或更改值的唯一目的類實現一個獲取並設置配置值的接口的類要多得多嗎? – Casey

1

我認爲問題是要麼找不到測試工作目錄中的文件或文件本身加載失敗。

我已經通過顯式加載名稱配置文件解決了這個問題。在你的情況下,你可以嘗試相同的。

ExeConfigurationFileMap configMap = new ExeConfigurationFileMap(); 
configMap.ExeConfigFilename = @"d:\test\test.config"; 
Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None); 
0

我所用的測試項目後生成的命令行,但要記住,如果有變更生成項目:

copy /Y "$(SolutionDir)$(SolutionName)\App.Debug.config" "$(TargetDir)$(ProjectName)$(TargetExt).config" 
相關問題