.NET Tests .config loader
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace {MyProject}_Tests
{
[TestClass]
public class ConfigFileContextInitializer
{
static ConfigFileContext config;
[AssemblyInitialize]
public static void AssemblyInitialize(TestContext ctx)
{
config = ConfigFileContext.Change(@"..\..\..\{MyProject}\web.config");
DatabaseConfig.Initialize();
}
[AssemblyCleanup]
public static void AssemblyCleanup()
{
if (config != null)
config.Dispose();
}
}
}
using System;
using System.Configuration;
using System.Linq;
using System.Reflection;
namespace {MyProject}_Tests
{
public abstract class ConfigFileContext : IDisposable
{
public static ConfigFileContext Change(string path)
{
return new ChangeConfigFileContext(path);
}
public abstract void Dispose();
private class ChangeConfigFileContext : ConfigFileContext
{
private readonly string oldConfig =
AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
private bool disposedValue;
public ChangeConfigFileContext(string path)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
ResetConfigMechanism();
}
public override void Dispose()
{
if (!disposedValue)
{
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig);
ResetConfigMechanism();
disposedValue = true;
}
GC.SuppressFinalize(this);
}
private static void ResetConfigMechanism()
{
typeof(ConfigurationManager)
.GetField("s_initState", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, 0);
typeof(ConfigurationManager)
.GetField("s_configSystem", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
typeof(ConfigurationManager)
.Assembly.GetTypes()
.Where(x => x.FullName ==
"System.Configuration.ClientConfigPaths")
.First()
.GetField("s_current", BindingFlags.NonPublic |
BindingFlags.Static)
.SetValue(null, null);
}
}
}
}