2010-01-08 9 views
6

Estoy probando unitariamente mi archivo de configuración para una aplicación de formularios de victoria. En LocalTestRun.testrunconfig lo configuré para copiar el app.config. Revisé Environment.CurrentDirectory mientras se ejecutaba la prueba y el archivo tampoco tiene esta cadena de conexión adicional. Este es el método de ensayo:¿Por qué ConfigurationManager.OpenMappedExeConfiguration tiene una cadena de conexión adicional que no está en el archivo?

[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); 
     } 
     } 

    } 

sin embargo cuando iterar el config.ConnectionStrings.ConnectionStrings que tienen una cadena de configuración adicional que no está en el archivo:

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

Esto no es y nunca fue un asp.net proyecto.

Aquí está el fichero de configuración:

<?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> 

Dónde está esta cadena de conexión adicional viene?

+0

+1 Siempre me he preguntado esto, ahora lo sé, gracias :) –

Respuesta

10

Esa cadena de conexión se define en el archivo de configuración de nivel de máquina, machine.config.

Si nos fijamos en el archivo C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\machine.config, verá la siguiente sección:

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

¿Hay alguna manera de leer la aplicación.config de forma aislada en lugar de cargar la aplicación.config como un archivo xml? – Maslow

+0

No, lo siento, es como dice marc_s! –

10

de Dave clavado la respuesta principal - upvoted.

Pero: si usted quiere deshacerse de cualquier cadena de conexión de la machine.config o cualquier web.configs "aguas arriba", siempre se puede utilizar:

<?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> 

Ese primer <clear/> en la conexión La sección de cadenas elimina cualquier cadena de conexión previamente presente y comienza con una pizarra limpia.

+0

¿Hay alguna manera de decirle al administrador de configuración que cargue solo el archivo que especifico para probar? – Maslow

+0

Quiero probar el archivo de configuración de la aplicación, no el de la máquina. – Maslow

+0

No, el sistema de configuración ASP.NET ya es una jerarquía de machine.config, su "raíz" web.config y cualquier posible "upstream" web.configs. No puedes cambiar eso, es un mecanismo tan fundamental. –

Cuestiones relacionadas