2010-07-02 28 views
2

我需要为返回xmldocument的方法创建单元测试。我应该在这种情况下验证什么?该方法检查数据库并创建一个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

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

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

一旦你可以提供定义好的测试输入到方法,验证每个测试输入产生所需的测试输出 - 单元测试。

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

编辑

要回答你的编辑,你可以测试是否一个XmlDocument的特定位是“有效”很容易。例如是否为根元素“成员”:

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

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

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

+0

是啊,Mockdatabase似乎是正确的方式。谢谢 – 2010-07-02 20:05:40

0

将所得到的文档总是蜜蜂100%相同,或者你需要实际检验数据中文件

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

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

如果它适用于您的方案,100%版本更容易,更准确。