2009-06-04 35 views
10

我有多个NUnit测试,我希望每个测试都使用特定的app.config文件。 有没有办法在每次测试之前将配置重置为新的配置文件?用nunit重新加载app.config

回答

8

尝试:

每个测试
/* 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

这似乎工作完美。你会如此善意地解释它实际上做了什么? :-) – Karsten 2009-06-09 15:22:45

0

如果问题是您针对不同的测试用例集需要不同的配置,那么您可以为每个测试用例配置不同的测试项目。然后一次运行一个测试项目。

+0

一个项目? – apollodude217 2010-07-15 20:08:54

0

I answered a similar question for Powershell。同样的技术也应该在这里工作,只需调用在测试开始时的以下内容:

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

编辑:其实看起来这是一个比较复杂编译EXE中 - 你需要做的something like this为了得到该配置重新加载。