Как совместить XmlDocument.load с помощью Microsoft Fakes - PullRequest
0 голосов
/ 28 мая 2020
    var xml = new XmlDocument();
    xml.LoadXml("<add name=\"console\" type=\"DefaultTraceLoader\" value=\"Error\"/>");

    string path = @"D:\Config.xml";
    System.IO.Fakes.ShimFile.ExistsString = p => true;

                    System.Xml.Fakes.ShimXmlDocument.AllInstances.LoadString = (a,b)=>
                    {
                        a = xDoc;
                        b = path;
                    };

System.Xml.fakes:

<Fakes xmlns="http://schemas.microsoft.com/fakes/2011/">
  <Assembly Name="System.Xml" Version="4.0.0.0"/>
  <ShimGeneration>
    <Add FullName="System.Xml.XmlDocument!"/>
  </ShimGeneration>
</Fakes>

Я пишу модульный тестовый пример, чтобы объединить метод загрузки xmldocument. Когда я отлаживаю исходный проект, он не возвращается выше xmldocument. Я не правильно делаю, чтобы функция loadstring вернула ожидаемый документ xml в основном проекте?

1 Ответ

0 голосов
/ 26 июня 2020
ShimXmlDocument.AllInstances.LoadString = (a,b)=> 
{
    a = xDoc;
    b = path;
};

Это сработало бы, как вы ожидали, если бы в качестве параметра ref было передано «a». Это не так, и, следовательно, вы не можете изменить объект, на который он указывает, вне лямбда-функции, то есть в тестируемом методе.

Вы можете добиться желаемого, изменив лямбда, как показано ниже:

ShimXmlDocument.AllInstances.LoadString = (a,b)=>
{
   a.LoadXml("<add name=\"console\" type=\"DefaultTraceLoader\" value=\"Error\"/>");
};
...