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

如何在NUnit中编写测试方法来测试savefile方法?,nunit,tdd,Nunit,Tdd,我编写了一个savefile方法将对象保存到xml。但我不知道如何在NUnit中测试该方法。我是否需要手动创建示例文件并比较文件之间的字符串?有没有更好的方法来测试这个方法 谢谢你的回答。我就是这么做的——它适合我,但可能不符合你的规格 在拆卸过程中,我确保删除了作为套件一部分创建的所有文件。因此,是的,请确保该文件是一个仅用于测试的临时文件 在测试方法中,如果文件存在,我会删除它(不应该删除,因为拆卸已经处理了它),然后将文件输出到XML,然后断言文件存在。然后,我将文件重新加载到对象图或XM

我编写了一个savefile方法将对象保存到xml。但我不知道如何在NUnit中测试该方法。我是否需要手动创建示例文件并比较文件之间的字符串?有没有更好的方法来测试这个方法

谢谢你的回答。

我就是这么做的——它适合我,但可能不符合你的规格

在拆卸过程中,我确保删除了作为套件一部分创建的所有文件。因此,是的,请确保该文件是一个仅用于测试的临时文件

在测试方法中,如果文件存在,我会删除它(不应该删除,因为拆卸已经处理了它),然后将文件输出到XML,然后断言文件存在。然后,我将文件重新加载到对象图或XMLDOM中,并根据需要通过尽可能多的断言查询状态


如果您可以不写入文件,并且您的设计允许您写入通用文本编写器或xml编写器,那么您可以绕过文件保存,而使用字符串编写器替换调用,而只查询字符串。更干净,但它不测试实际的文件持久性是否工作。

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

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


不幸的是,用C#对象编写xml既大又笨重。我建议一次测试一个小节。可能您的保存文件有一个子元素
,一个子元素
子元素。在这种情况下,编写一系列测试,以确保正确完成每个小节,而不是整个输出。

如果显示代码,会更容易。 我的解决方法是添加一层抽象。 不要让您的Save方法直接处理XmlWriter。相反,创建包装器,每个包装器都能够将数据的小逻辑块保存到xml中,并对其进行测试

对于每个包装器,都有如下方法

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

设计您的类,这样您就有了SaveFile(字符串文件名)和SaveFile(XmlWriter)。SaveFile(字符串文件名)只需要为命名文件创建一个XmlWriter并调用SaveFile(writer)。对SaveFile(XmlWriter)方法进行广泛的单元测试,您可以使用模拟XmlWriter。在SaveFile(stringfilename)方法上测试一些错误条件——如果希望处理它们而不是向上传播它们的话。根据错误处理的不同,您可能根本不需要创建文件

顺便说一句,如果不想直接使用XmlWriter公开方法,则不需要直接公开方法。您可以将其设置为私有,并在测试中使用访问器调用它。

选项

  • 简单化:使用“黄金文件”方法。创建一个只读的预期输出文件作为资源。将字节/字符串与实际生成的文件进行比较
  • 我听说有人用这个。从未亲自使用过,但可能值得一看

  • 你可能想改写你的问题。。如果您特别关注验证生成的xml。如何编写测试来验证XML输出?