单元测试返回xmldocument的方法

时间:2010-07-02 19:40:40

标签: c# xml unit-testing

我需要为返回xmldocument的方法创建单元测试。在这种情况下我应该怎样验证?该方法检查数据库并创建xmldocument并将数据发送回客户端。

我应该查看返回的xmldocument是否包含所有预期的xml标记?或者我应该有一个Expected.xml文件并匹配使用此xml文件返回的xmldocument。如果我按照第二种方法进行操作,那么无论我在搜索什么都不存在于数据库中,那么这个测试总是会失败。我想编写一个不依赖于任何特定数据的测试但是应该检查方法返回的数据是否正确,所以我倾向于只检查标签并假设如果标签在那里并且这些标签中的值也是正确的。

让我们假设我为一个图书馆应用程序编写了这个测试,该应用程序给出了发给特定成员的所有书籍的列表。成员由id标识,并使其成为字符串:

<Member id="">
 <Book>
   <Name>Book_name</Name>
   <Author>author</Author>
   <Due_date>due date </Due_Data>
 </Book>
</Member>

所以我需要验证我的方法是否会返回上面的xmlfile。我需要验证标签是否正确并且它包含值(而不是空值)。

您认为应该采取更好的方法?如果有人之前处理过这种情况,那么如果你能分享你的经验就会很棒。

谢谢,

2 个答案:

答案 0 :(得分:2)

问题不在于XmlDocument - 很容易检查它是否与预期输出匹配。

您的问题更多地与测试输入数据有关。在这种情况下,您需要针对特殊设置的测试数据库运行代码,以便您可以依赖它始终为给定查询返回相同的数据,或者您需要模拟数据库(通过您自己的类调用数据库,以便您可以用一些简单地假装成数据库的代码替换它并返回您希望尝试的单元测试输入)

一旦您可以为方法提供定义良好的测试输入,您就可以验证每个测试输入是否产生了所需的测试输出 - 单元测试。

如果您希望不那么严格,那么您可以检查数据库是否返回格式正确的XML文档(包含一组键元素和属性),但这仍然需要您有一些有效的输入数据测试(因此您可能仍需要测试或模拟数据库)并且不会彻底测试该方法。

修改

要回答您的编辑,您可以非常轻松地测试XmlDocument的特定位是否“有效”。例如根元素是“成员”:

Assert(doc.DocumentElement.Name == "Member");

根元素是否具有非空白的子元素“名称”,并且没有子元素?

Assert(doc.DocumentElement["Name"] != null);
Assert(!string.IsNullOrEmpty(doc.DocumentElement["Name"].InnerText));
Assert(doc.DocumentElement["Name"].ChildNodes.Count == 0);

答案 1 :(得分:0)

生成的文档是否始终100%相同,或者您是否需要实际验证文档中的数据?

如果是100%,我会在测试项目中存储预期文档的文件副本,将其添加到资源文件中,然后执行直接字符串&lt; - &gt;字符串比较。

如果是特定数据,我会以相同的方式在测试项目中存储文档的精简版本,并创建一个比较引擎,它接收两个文档并读取一个(存储的资源)中的所有现有值测试目标中的相应值。

如果100%版本适用于您的场景,则更容易,更准确。