有没有一种方法可以获取基于任意xml的System.Configuration.Configuration实例?

时间:2020-03-05 18:41:45  来源:igfitidea点击:

我正在尝试对编写的自定义ConfigurationSection进行单元测试,并且希望将一些任意配置XML加载到每个测试的System.Configuration.Configuration中(而不是将测试配置xml放入Tests.dll中。配置文件,就是说,我想做这样的事情:

Configuration testConfig = new Configuration("<?xml version=\"1.0\"?><configuration>...</configuration>");
MyCustomConfigSection section = testConfig.GetSection("mycustomconfigsection");
Assert.That(section != null);

但是,看来ConfigurationManager仅会为我们提供与EXE文件或者计算机配置关联的Configuration实例。有没有一种方法可以将任意XML加载到Configuration实例中?

解决方案

回答

看着班上的成员,我想答案可能不是*。我不确定为什么还是要这样做,而不是创建自己的XML配置文件。

*否,不包括凌乱的反射黑客

回答

我认为我们正在寻找的是ConfigurationManager.OpenMappedExeConfiguration

它允许我们打开使用文件路径指定的配置文件(包装在ExeConfigurationFileMap内部)

如果其他发布者说的是正确的,并且我们不想创建一个全新的XML文件进行测试,那么我建议我们将"配置"编辑内容放入"测试"方法本身,然后针对新更改的配置运行测试数据。

回答

实际上,我已经找到了一种方法。

我们需要定义一个从原始配置部分继承的新类,如下所示:

public class MyXmlCustomConfigSection : MyCustomConfigSection
{
    public MyXmlCustomConfigSection (string configXml)
    {
        XmlTextReader reader = new XmlTextReader(new StringReader(configXml));
        DeserializeSection(reader);
    }
}

然后,可以实例化ConfigurationSection对象,如下所示:

string configXml = "<?xml version=\"1.0\"?><configuration>...</configuration>";
MyCustomConfigSection config = new MyXmlCustomConfigSection(configXml);

希望它可以帮助某人:-)