2010-01-08 5 views
6

Ich bin Gerät testen meine Konfigurationsdatei für eine Win-Forms-Anwendung. In der LocalTestRun.testrunconfig ich habe es festgelegt, um die app.config zu kopieren. Ich habe die Environment.CurrentDirectory überprüft, während der Test ausgeführt wurde, und die Datei hat diese zusätzliche Verbindungszeichenfolge auch nicht. Dies ist die Testmethode:Warum hat ConfigurationManager.OpenMappedExeConfiguration eine zusätzliche Verbindungszeichenfolge, die nicht in der Datei enthalten ist?

[TestMethod] 
    public void Configuration_ConnectionStrings_Connect() 
    { 
     Console.WriteLine(Environment.CurrentDirectory); 
     Assert.IsTrue(System.IO.File.Exists("App.Config")); 
     var configFileMap = new ExeConfigurationFileMap(){ ExeConfigFilename = "App.Config"}; 

     var config= ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); 

     foreach (ConnectionStringSettings connectionString in config.ConnectionStrings.ConnectionStrings) 
     { 
      //Assumes all connections are to Sql server, test must be updated if not 
      Assert.AreEqual("System.Data.SqlClient",connectionString.ProviderName,"Test was only designed for SQL clients"); 
     using (var cn=new System.Data.SqlClient.SqlConnection(connectionString.ConnectionString)) 
     { 
      cn.Open(); 
      Assert.AreEqual(System.Data.ConnectionState.Open,cn.State); 
     } 
     } 

    } 

jedoch Als ich iterieren die config.ConnectionStrings.ConnectionStrings ich eine zusätzliche Konfigurationsstring haben, die nicht in der Datei ist:

data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true 

Dies ist nicht und war nie ein asp.net Projekt.

Hier ist die Config-Datei:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
<configSections> 
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
     <section name="HLIT_Ticketing.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" /> 
    </sectionGroup> 
</configSections> 
<connectionStrings> 
    <add name="HLIT_Ticketing.Properties.Settings.HomeQConnectionString" 
     connectionString="Data Source=******\*****;Initial Catalog=*****;Persist Security Info=True;User ID=*****;Password=******" 
     providerName="System.Data.SqlClient" /> 
</connectionStrings> 
<userSettings> 
    <HLIT_Ticketing.Properties.Settings> 
     <setting name="AssociateRole" serializeAs="String"> 
      <value>Associate</value> 
     </setting> 
     <setting name="DeveloperRole" serializeAs="String"> 
      <value>Developer</value> 
     </setting> 
    </HLIT_Ticketing.Properties.Settings> 
</userSettings> 

Wo ist diese zusätzliche Verbindungszeichenfolge aus Richtung?

+0

+1 Ich habe mich schon immer gefragt, jetzt weiß ich, danke :) –

Antwort

10

Diese Verbindungszeichenfolge ist in der Konfigurationsdatei auf Maschinenebene definiert, machine.config.

Wenn man sich die Datei aussehen C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config finden Sie im folgenden Abschnitt:

<connectionStrings> 
    <add name="LocalSqlServer" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient"/> 
</connectionStrings> 
+1

Gibt es eine Möglichkeit, die app.config isoliert zu lesen, anstatt die app.config als XML-Datei zu laden? – Maslow

+0

Nein, tut mir leid - es ist wie marc_s sagt! –

10

Dave die Haupt Antwort genagelt - upvoted.

Aber: Wenn Sie von jeder Verbindungszeichenfolge aus dem machine.config oder irgendwelchen „up-stream“ web.configs loswerden wollen, können Sie immer verwenden:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
     <clear /> 
     <add name="HLIT_Ticketing.Properties.Settings.HomeQConnectionString" 
      connectionString="Data Source=******\*****;Initial Catalog=*****;Persist Security Info=True;User ID=*****;Password=******" 
      providerName="System.Data.SqlClient" /> 
    </connectionStrings> 

Das erste <clear/> in der Verbindung Der Strings-Bereich löscht alle zuvor vorhandenen Verbindungszeichenfolgen und beginnt mit einem sauberen Slate.

+0

Gibt es eine Möglichkeit, dem Konfigurationsmanager mitzuteilen, dass nur die Datei geladen werden soll, die ich zum Testen angegeben habe? – Maslow

+0

Ich möchte die Konfigurationsdatei der App testen, nicht die der Maschine. – Maslow

+0

Nein, das ASP.NET-Konfigurationssystem ist bereits eine Hierarchie aus machine.config, Ihrer "root" web.config und allen potenziellen "upstream" web.configs. Du kannst das nicht ändern, es ist so ein fundamentaler Mechanismus. –

Verwandte Themen