如何对修改XML文档进行单元测试?

本文关键字:单元测试 文档 XML 修改 | 更新日期: 2023-09-27 18:07:24

我不知道如何开始为这个方法创建单元测试:

public override void ModifyXmlDocument(Foo foo, string nodeToChange, string newValue)
{
    XmlDocument xmlDocument = new XmlDocument();
    xmlDocument.Load(foo.XmlPathAndFileName);
    XmlElement rootElement = xmlDocument.DocumentElement;
    // rest of method (to modify an XML doc) here
}

该方法只是在XML文档中查找元素/节点,并用用户提供的值更新它。(这个方法比这里显示的要复杂得多。)

我很难理解的部分是如何让这个方法执行,而不依赖于硬盘。但是xmlDocument.Load()获取文件路径并从磁盘加载文件。在该方法结束时,它将更新后的文件保存回磁盘。

我如何使这个方法单元可测试?

如何对修改XML文档进行单元测试?

有几种方法可以做到这一点,但都需要重构代码。ModifyXmlDocument将需要将XmlDocument作为参数,然后您可以从那里模拟它。

public void test_that_xml_is_loaded()
{
    var sut = new SUT();
    var xmldocumentfake = new Mock<XmlDocument>(){CallBase=true};
    xmldocumentfake.Setup(x=>x.LoadXml(It.IsAny<String>()));
    sut.ModifyXmlDocument(foo, nodeToChange, newValue, xmlDocumentfake.Object);
   xmldocumentfake.Verify(x=>x.LoadXml(It.IsAny<String>()), Times.Once());
}

您还可以将XmlDocument包装在另一个类中,您可以将其编写为可以修改的抽象。同样,您必须将它传递进去。

同样,正如Anthony Pegram所暗示的和我的意思:小心你没有打破单一责任原则。当测试太难编写时,这通常是一声尖叫,说明您已经打破了这个原则。

几个选项:

  • 如果你正在使用VS2012 Ultimate,你可以使用Fakes来创建一个shim,当XmlDocument打开文件时将覆盖该行为。
  • 在进行测试时,将示例XML文件与单元测试一起部署。然后,当传入一个Foo实例时,使用该文件的路径。
  • 尝试XmlDocument的替代方案之一。加载一个流或XmlReader。然后用一个你可以重写的方法创建它。