繁体   English   中英

一个单元如何测试修改XML文档?

[英]How does one unit test modifying an XML document?

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

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()采用文件路径并从磁盘加载文件。 方法结束时,它将更新的文件保存回磁盘。

如何使该方法单元可测试?

有两种方法可以执行此操作,但是所有方法都需要重构代码。 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创建一个填充文件,该填充文件将在XmlDocument打开文件时覆盖其行为。
  • 在测试时,请在单元测试中部署示例XML文件。 然后,当传入Foo实例时,请使用该文件的路径。
  • 尝试使用XmlDocument.Load的替代项之一,例如采用流或XmlReader的替代项。 然后使用可以覆盖的方法来创建它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM