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

时间:2008-10-17 15:55:54

标签: nunit tdd

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

感谢您的回答。

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

如果您展示代码会更容易。 我的方法是添加一层抽象。 不要让您的Save方法直接与XmlWriter打交道。而是创建包装器,每个包装器能够将数据的小逻辑块保存到xml,并测试它们。

每个Wrapper的

都有类似

的方法
void Persist(XmlWriter writer);

然后让Save只从包装器中收集数据。换句话说,Wrappers有责任正确保存数据,但每个人都只负责它的一小部分。 在那里你可以通过比较字符串来测试它(把StringWriter放到你传递给Persist方法的XmlWriter中)

答案 2 :(得分:1)

选项

  1. 简单:使用'Golden file'方法。创建一个只读的预期输出文件作为资源。比较字节/字符串与实际生成的文件进行比较。
  2. 我听说有些人为此目的使用XmlUnit。从来没有亲自使用它,但可能值得一看

答案 3 :(得分:0)

这就是我的工作 - 它对我有用,但可能不符合您的规格。

在拆解中,我确保删除我可能在套件中创建的任何文件。所以是的,请确保该文件只是用于测试的临时文件

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

如果你可以逃避写入文件而你的设计允许你写入通用文本编写器或xml编写器,那么你可以绕过文件保存并用字符串编写器替换调用而只是查询字符串。更清洁,但它不测试实际的文件持久性是否有效。

答案 4 :(得分:0)

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

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