11

I have multiple NUnit tests, and I would like each test to use a specific app.config file. Is there a way to reset the configuration to a new config file before each test?

Karsten
  • 8,015
  • 8
  • 48
  • 83

3 Answers3

8

Try:

/* 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);
        }
    }
}
Dylan Beattie
  • 53,688
  • 35
  • 128
  • 197
  • This seems to work perfect. Would you be so kind to explain what it actually does? :-) – Karsten Jun 09 '09 at 15:22
  • 2
    This didn't work for me (using .NET 4.0). I had to extend it, please see my answer here: http://stackoverflow.com/questions/6150644/change-default-app-config-at-runtime/6151688#6151688 – Daniel Hilgarth May 27 '11 at 11:37
0

If you issue is that you for different sets of test cases needs to have different configurations you can have different test projects with a configuration file for each. Then run your test projects one at a time.

Rune FS
  • 21,497
  • 7
  • 62
  • 96
0

I answered a similar question for Powershell. The same technique should work here, simply call the following at the start of your test:

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

EDIT: Actually looks like this is more complicated within a compiled exe - you need to do something like this in order to get the config reloaded.

Community
  • 1
  • 1
Chris Ballard
  • 3,771
  • 4
  • 28
  • 40