如何对修改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()
获取文件路径并从磁盘加载文件。在该方法结束时,它将更新后的文件保存回磁盘。
我如何使这个方法单元可测试?
有几种方法可以做到这一点,但都需要重构代码。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。然后用一个你可以重写的方法创建它。