Есть ли способ получить экземпляр System.Configuration.Configuration на основе произвольного xml?

Я пытаюсь выполнить unit test настраиваемое ConfigurationSection, которое я написал, и я хотел бы загрузить произвольный конфигурационный XML в System.Configuration.Configuration для каждого теста (вместо того, чтобы помещать тестовую конфигурацию xml в файл Tests.dll.config. То есть я хотел бы сделать что-то вроде этого:

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

Однако, похоже, что ConfigurationManager предоставит вам только экземпляры конфигурации, связанные с EXE файлом или конфигурацией машины. Есть ли способ загрузить произвольный XML в экземпляр конфигурации?

Ответы

Ответ 1

Фактически есть способ, который я обнаружил....

Вам необходимо определить новый класс, наследующий исходный раздел конфигурации, следующим образом:

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);

Надеюсь, что это поможет кому-то: -)

Ответ 2

Я думаю, что вы ищете ConfigurationManager. OpenMappedExeConfiguration

Он позволяет вам открыть файл конфигурации, указанный вами с помощью пути к файлу (завернутый внутри ExeConfigurationFileMap)

Если то, что сказал другой плакат, верно, и вы не хотите создавать целый новый XML файл для тестирования, я бы рекомендовал вам поместить ваши изменения в Configuration в самом методе тестирования, а затем выполнить ваши тесты против недавно измененные данные конфигурации.

Ответ 3

Глядя на членов класса, я бы сказал, что ответ, вероятно, не *. Я не уверен, почему вы все равно хотите сделать это, а не создавать свой собственный файл конфигурации XML.

* Это нет, исключая грязные рефлексивные хаки