2009-06-04 12 views
10

Ich habe mehrere NUnit-Tests, und ich möchte, dass jeder Test eine bestimmte app.config-Datei verwendet. Gibt es eine Möglichkeit, die Konfiguration vor jedem Test auf eine neue Konfigurationsdatei zurückzusetzen?Reload app.config mit Nunit

Antwort

8

Versuchen:

/* Usage 
* using(AppConfig.Change("my.config")) { 
* // do something... 
* } 
*/ 
public abstract class AppConfig : IDisposable 
{ 
    public static AppConfig Change(string path) 
    { 
     return new ChangeAppConfig(path); 
    } 
    public abstract void Dispose(); 

    private class ChangeAppConfig : AppConfig 
    { 
     private bool disposedValue = false; 
     private string oldConfig = Conversions.ToString(AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE")); 

     public ChangeAppConfig(string path) 
     { 
      AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); 
      typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0); 
     } 

     public override void Dispose() 
     { 
      if (!this.disposedValue) 
      { 
       AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", this.oldConfig); 
      typeof(ConfigurationManager).GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static).SetValue(null, 0); 
       this.disposedValue = true; 
      } 
      GC.SuppressFinalize(this); 
     } 
    } 
} 
+0

Das scheint perfekt zu funktionieren. Würdest du so freundlich erklären, was es eigentlich macht? :-) – Karsten

+2

Dies funktionierte nicht für mich (mit .NET 4.0). Ich musste es erweitern, siehe meine Antwort hier: http://stackoverflow.com/questions/6150644/change-default-app-config-at-runtime/6151688#6151688 –

0

Wenn Sie angeben, dass Sie für verschiedene Sätze von Testfällen unterschiedliche Konfigurationen haben müssen, können Sie verschiedene Testprojekte mit einer Konfigurationsdatei für jeden haben. Führen Sie anschließend Ihre Testprojekte nacheinander aus.

+0

ein Projekt pro Test? – apollodude217

0

I answered a similar question für Powershell. Die gleiche Technik soll hier arbeiten, rufen Sie einfach den folgende zu Beginn des Tests:

System.AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configPath)

EDIT: sieht tatsächlich wie dies komplizierter innerhalb eines kompilierten exe - Sie something like this in tun müssen, um zu bekommen Die Konfiguration wurde neu geladen.