如何在NUnit中编写测试方法来测试savefile方法?

4

我编写了一个用于将对象保存为xml的savefile方法。但是,我不确定如何在NUnit中测试该方法。我需要手动创建样本文件并比较文件之间的字符串吗?还有其他更好的测试方法吗?

谢谢您的答复。


如果您特别想验证生成的 XML,请重新措辞您的问题。如何编写测试以验证 XML 输出? - Gishu
5个回答

1

啊,验证XML输出。欢迎来到地狱 :)

对我有效的方法是在内存中生成一个XmlDocument对象。然后运行您的SaveFile方法,并将其加载到另一个XmlDocument中。递归遍历两个XmlDocuments,比较所有元素和属性。

不幸的是,使用C#对象编写xml很大而笨重。我建议一次测试子部分。也许您的保存文件有一个<FileList>子元素,一个<Cups>子元素和一个<Rifles>子元素。在这种情况下,编写一系列测试以确保每个子部分都正确完成,而不是整体输出。


1

选项

  1. 简单:使用“黄金文件”方法。创建一个只读的预期输出文件作为资源。将其与实际生成的文件进行逐字节/字符串比较。
  2. 我听说有些人使用XmlUnit来实现此目的。个人没有使用过,但值得一看。

1

如果您展示代码会更容易。

我的方法是添加一层抽象。不要让Save方法直接处理XmlWriter。相反,创建包装器,每个包装器都能将数据的小逻辑块保存到xml,并对其进行测试。

对于每个包装器,都有一个类似于以下的方法

void Persist(XmlWriter writer);

让Save只从包装器中收集数据。换句话说,保存数据的责任将由包装器负责,但每个包装器只负责其中的一小部分。 您可以通过比较字符串(将StringWriter放入传递给Persist方法的XmlWriter中)来测试它


0
这是我的做法--对我有效,但可能不符合您的要求。
在拆除方法中,我确保删除了作为套件一部分创建的任何文件。所以,请确保文件只是用于测试的临时文件。
在测试方法中,如果文件存在,我会删除它(理应不存在,因为拆解方法已经处理了它),然后将文件输出到 XML,然后断言该文件存在。然后,我重新加载文件,将其转换成对象图或 XML DOM,并通过尽可能多的断言查询状态。
如果您可以使用文件写入并且您的设计允许您向通用文本编写器或 XML 编写器编写,则可以绕过文件保存并将调用替换为字符串编写器,然后只需查询字符串即可。更清晰,但无法测试实际文件持久性是否正常工作。

0
设计你的类,使得你有SaveFile(string fileName)和SaveFile(XmlWriter writer)两个方法。SaveFile(string filename)只需要为指定的文件创建一个XmlWriter并调用SaveFile(writer)。对于SaveFile(XmlWriter writer)方法进行广泛的单元测试,可以使用模拟的XmlWriter。在SaveFile(string filename)方法上测试一些错误条件--如果您希望处理它们而不是将它们传播出去。根据错误处理方式,您可能根本不需要创建文件。
顺便说一下,如果您不想直接使用XmlWriter公开您的方法,您可以将其设置为私有,并使用访问器在测试中调用它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接