2010-11-05 17 views
12

ho le prove folowing:Come leggere app.config del progetto unittest dal test con HOSTTYPE ("talpe")

[TestClass] 
public class GeneralTest 
{ 
    [TestMethod] 
    public void VerifyAppDomainHasConfigurationSettings() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 

    [TestMethod] 
    [HostType("Moles")] 
    public void VerifyAppDomainHasConfigurationSettingsMoles() 
    { 
     string value = ConfigurationManager.AppSettings["TestValue"]; 
     Assert.IsFalse(String.IsNullOrEmpty(value), "No App.Config found."); 
    } 
} 

L'unica differenza tra loro è [HostType("Moles")]. Ma il primo passa e il secondo fallisce. Come posso leggere App.config dal secondo test?

Oppure è possibile aggiungere un altro file di configurazione in un altro posto?

+0

Una grande soluzione è stata presentata alla mia domanda simile: http://stackoverflow.com/questions/9117248/cant-access-information-from-configuration-files-when-tests-have-host-type -mol –

+0

Ho trovato questa risposta: http://stackoverflow.com/a/6151688/13390 per essere il modo migliore per cambiare il file di configurazione quando si usano le talpe. Funziona magnificamente se usi sezioni di configurazione personalizzate (in realtà, è l'unico che ha funzionato in quel caso). –

risposta

6

Vedi http://social.msdn.microsoft.com/Forums/en/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6

Nel frattempo, come un lavoro in giro, si potrebbe provare ad aggiungere le impostazioni di configurazione per Microsoft.Moles.VsHost.x86.exe.config

+3

Secondo il link, si tratta di un bug su cui si sta lavorando. Solo così ppl non devi andare laggiù e leggere il thread. – jcollum

+0

Questo fa davvero schifo. Abbiamo alcuni test di integrazione in cui (nel bene o nel male) il test app.config è in realtà abbastanza grande. Sono bloccato reimplementare il ConfigurationManager/WebConfigurationManager. – BFree

5
[ClassInitialize] 
    public static void MyClassInitialize(TestContext testContext) 
    { 
     System.Configuration.Moles.MConfigurationManager.GetSectionString = 
      (string configurationName) => 
       { 
        ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); 
        Assembly assembly = Assembly.GetExecutingAssembly(); 
        fileMap.ExeConfigFilename = assembly.Location + ".config"; 
        Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); 
        object section = config.GetSection(configurationName); 
        if (section is DefaultSection) 
        { 
         ConfigurationSection configurationSection = (ConfigurationSection) section; 
         Type sectionType = Type.GetType(configurationSection.SectionInformation.Type); 
         if (sectionType != null) 
         { 
          IConfigurationSectionHandler sectionHandler = 
           (IConfigurationSectionHandler)AppDomain.CurrentDomain.CreateInstanceAndUnwrap(sectionType.Assembly.FullName, sectionType.FullName); 
          section = 
           sectionHandler.Create(
            configurationSection.SectionInformation.GetParentSection(), 
            null, 
            XElement.Parse(configurationSection.SectionInformation.GetRawXml()).ToXmlNode()); 
         } 
        } 

        return section; 
       }; 
    } 
+1

Sembra promettente questa simulazione del ConfigurationManager, ma se lo uso per ottenere un'appSetting, si verifica il seguente errore: 'System.Configuration.ConfigurationErrorsException: La sezione di configurazione' appSettings 'ha una dichiarazione inaspettata'. Qualche correzione su questo? – Dennis

+0

@Dennis, per ovviare a questo errore, vedere il codice di esempio qui: http://social.msdn.microsoft.com/Forums/is/pex/thread/9b4b9ec5-582c-41e8-8b9c-1bb9457ba3f6 Se non si Non ci sono appSettings personalizzati, puoi semplicemente "restituire nuovo NameValueCollection();" –

2

mi sono imbattuto in questo problema al lavoro e non ha gradito nessuna di queste risposte. Ho anche il problema che il file di configurazione viene letto in un costruttore statico, il che significa che non posso Mole ConfigurationManager prima che venga eseguito il costruttore statico.

Ho provato questo sul mio computer di casa e ho trovato che il file di configurazione veniva letto correttamente. Si scopre che stavo usando Pex 0.94.51006.1 a casa. Questo è leggermente più vecchio di quello attuale. Sono stato in grado di trovare un download per la versione accademica precedente: http://research.microsoft.com/en-us/downloads/d2279651-851f-4d7a-bf05-16fd7eb26559/default.aspx

L'ho installato sul mio computer di lavoro e tutto funziona perfettamente. A questo punto, eseguo il downgrade alla versione precedente finché non viene rilasciata una versione più recente.

+0

Benvenuti in Stack Overflow. Questo è un sito di domande e risposte, non un tipico forum, quindi pubblicare una domanda come parte della risposta non avrà la giusta attenzione né è appropriato per il sito, poiché si suppone che la risposta a una domanda riguardi solo quella domanda . Normalmente ti consiglierei di pubblicare la tua domanda separatamente, ma chiedere se uno strumento è ancora in fase di sviluppo è off-topic qui. È una domanda che si rivolge meglio agli sviluppatori dello strumento. Grazie. –

17

Supponendo che si stia tentando di accedere ai valori in appSettings, che ne dici di aggiungere la configurazione all'inizio del test. Qualcosa di simile:

ConfigurationManager.AppSettings["Key"] = "Value"; 

Poi, quando il test cerca di leggere l'AppSettings "chiave", "Valore" saranno restituiti.

+0

Oh mio Dio. Se dipendesse da me, renderei questa la risposta accettata !!! Grazie mille. È un momento così dozzinale. lolz – pqsk

+3

Volevo solo aggiungere a chiunque fosse interessato l'aggiunta di una stringa di connessione è un po 'diversa: ConfigurationManager.ConnectionStrings.Add (new ConnectionStringSettings ("name", "connectionstring"); – pqsk

+0

Grazie, Kipp :) –

0

Questo è quello che sto usando per ottenere le corrette AppConfig e ConnectionString sezioni:

var config = System.Configuration.ConfigurationManager.OpenExeConfiguration(Reflection.Assembly.GetExecutingAssembly().Location); 

typeof(Configuration.ConfigurationElementCollection).GetField("bReadOnly", Reflection.BindingFlags.Instance | Reflection.BindingFlags.NonPublic).SetValue(System.Configuration.ConfigurationManager.ConnectionStrings, false); 
foreach (Configuration.ConnectionStringSettings conn in config.ConnectionStrings.ConnectionStrings) 
    System.Configuration.ConfigurationManager.ConnectionStrings.Add(conn); 

foreach (Configuration.KeyValueConfigurationElement conf in config.AppSettings.Settings) 
    System.Configuration.ConfigurationManager.AppSettings(conf.Key) = conf.Value; 

ha visto la parte ConnectionString here

11

È sufficiente aggiungere il file "app.config" al progetto di unit test . Leggerà automaticamente.

+3

A volte le soluzioni più semplici sono le migliori - questo funziona per me invece di tutto il problema con OpenExeConfiguration e simili ... – noonand

+0

Non ha funzionato per me :( – cbillowes