1

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

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

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

4

2 回答 2

6

有几种方法可以做到这一点,但都需要重构代码。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 所暗示的那样,我的意思是:小心不要违反单一责任原则。当测试太难写时,这通常是你打破了那个原则的尖叫。

于 2013-04-05T02:22:53.077 回答
1

几个选项:

  • 如果您使用的是 VS2012 Ultimate,则可以使用 Fakes 创建一个 shim,该 shim 将覆盖 XmlDocument 打开文件时的行为。
  • 当您进行测试时,请使用您的单元测试部署一个示例 XML 文件。然后在传入 Foo 实例时,使用该文件的路径。
  • 尝试使用 XmlDocument.Load 的替代方法之一,例如采用流或 XmlReader 的方法。然后使用您可以覆盖的方法创建它。
于 2013-04-05T02:24:36.640 回答