【问题标题】:Unit Testing: Creating complex XDocument for testing an xml reader单元测试:创建复杂的 XDocument 以测试 xml 阅读器
【发布时间】:2016-07-15 14:21:00
【问题描述】:

我有两个类 XmlWriter 和 XmlReader,它们在内部使用 XDocument 来存储/读取简单值,例如双精度、字符串和数组。

XmlWriter 类基本上是这样的

class XmlWriter
{
    internal XDocument document;

    Set(string name, double value);
    Set(string name, Int32 value);

    …
    SaveToFile(string filename);
}

现在,如果我想为 Set(string, double) 方法创建一个 UnitTest,我可以轻松地使用文档字段来检查是否使用 XPath 添加了正确的元素。

xmlWriter.Set("something," 123);

var myAddedElement = xmlWriter.document.XPathSelectElement(…);
Assert.AreEqual(myAddedElement.Value, 123);

此方法适用于 XmlWriter。然而,XmlReader 的测试非常棘手。据我所知,我有两个选择:

首先,我可以使用 XmlWriter 为 XmlReader 的单元测试设置 XDocument。

//Quick and dirty to give you an idea
writer.Set("something", 123);
reader.document = writer.document;
Assert.AreEqual(123, reader.Get("something");

我不太喜欢这样,因为现在 XmlReader 的 UnitTests 严重依赖于 XmlWriter 类。如果我破坏了 XmlWriter 类,XmlReader 的单元测试肯定也会失败。

我想到的另一个选择是手动创建 XDocument,这将变得相当乏味,尤其是如果 XmlStructure 稍微复杂一些。

你对这件事有什么看法?

提前致谢。

【问题讨论】:

  • 我的建议只是创建一个具有所需属性的类并使用序列化来写入/读取文件。

标签: c# xml unit-testing


【解决方案1】:

我看不到您的实现,但 IMO 您的类看起来像一个 XDocument 包装器,因此您的单元测试需要测试您的类是否调用了 XDocument 上的预期方法。我将模拟 XDocument 并验证是否为 Set、Get、Save 调用了您期望的方法。否则,您最终将尝试对各种 XML 可能性进行单元测试,而 XDocument 已经处理了这项工作。

【讨论】:

  • 我明白你的意思,但这意味着我还必须为 XElement、XAttribute 等创建可模拟的包装器。即如果我调用 Set("Something.Whatever.SomethingElse", 123),编写器类将添加一个由元素、子元素和属性组成的复杂结构。我设法使用 xml 模式检查了一些重要的事情,但我仍然需要测试一些事情。另外,因为通常有很多方法可以使用 XDocument 创建 xml 结构,所以我并不关心是否调用了 MethodX。我只关心生成的结构是否正确。
  • 您不能使用架构来验证文档吗?
  • This post 有一种很酷的方式来验证 xml 以进行单元测试
  • 我正在验证某些东西,但有些东西我无法真正验证。例如。当我试图读取一个不存在的元素时,我期望会引发某个异常。但是,我认为您提到的那篇文章可能有一个不错的方法。我大概可以使用它来创建 xml 文档的基本结构,然后动态添加我不想在测试中使用的结构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多