2011-10-25 72 views
0

我試圖測試一些依賴於配置值的功能(如果Settings["foo"] = true,則返回5,否則返回-1)。在tets項目的app.config文件中更改配置值

所以我想要做的是在運行時改變配置值。
我的配置文件看起來像這樣(簡化):

<configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">  
     <section name="DomainSettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/> 
     </sectionGroup> 
    </configSections> 

<applicationSettings> 
<DomainSettings> 
    <setting name="foo" serializeAs="String"> 
     <value>false</value> 
    </setting> 
</ICTS.SmartQueue.Domain.DomainSettings> 
</applicationSettings> 

和我做了以下內容:

//get config file 
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
//get relevant section 
var section = (ClientSettingsSection)config.GetSection("applicationSettings/DomainSettings"); 
//get element from section 
var element = section.Settings.Get("Foo"); 
//change its value and save it 
element.Value.ValueXml.InnerText = true.ToString(); 
config.Save(System.Configuration.ConfigurationSaveMode.Modified, true); 
//force refresh 
ConfigurationManager.RefreshSection("applicationSettings/DomainSettings"); 

我可以看到,價值實際上是改變了,當我在測試的配置'Out'目錄下的文件(MyTests.DLL.config)。
但是,DomainSettings.Default.Foo仍然評估爲'false'。

有什麼想法?

回答

0

配置文件被緩存。換句話說,僅僅因爲你用新值修改了配置文件,它將不會重新加載,直到應用程序重新加載。然後,你會看到新的值改變。但是當您在代碼中引用配置文件時,它不會讀取該文件,它會讀取緩存的配置文件。在你的情況下,這是而不是更新你的新值。

+0

我認爲'ConfigurationManager.RefreshSection'應該照顧那個。 (從MSDN:「此方法使指定配置節的緩存不會影響其他節」) –

0

這是因爲您可以在運行時更改配置文件,但只有在重新啓動應用程序之後才能接收更改。 ASP.NET是不同的,它將在Web.config文件更改後立即提取更改。

+0

因此,如果我更改Web配置中的值 - 在運行時 - 它會立即看到更改?與自動重新啓動應用程序? –

+0

是的,這是因爲應用程序會自動重新啓動。 – Icarus

相關問題