我编写了一个保存文件方法来将对象保存到 xml。但我不确定如何在 NUnit 中测试该方法。我是否需要手动创建示例文件并比较文件之间的字符串?有没有更好的方法来测试该方法?
感谢您的回答。
呃,验证 XML 输出。欢迎来到地狱 :)
XmlDocument
一种对我有用的方法是在内存中生成一个对象。然后运行您的 SaveFile 方法,并将其加载到另一个XmlDocument
. 递归遍历两个 XmlDocument,比较所有元素和属性。
不幸的是,用 C# 对象编写 xml 是大而笨重的。我建议一次测试小节。也许您的保存文件有一个<FileList>
子元素、一个<Cups>
子元素和一个<Rifles>
子元素。在这种情况下,编写一系列测试以确保每个子部分都正确完成,而不是整体输出。
如果您显示代码会更容易。我解决这个问题的方法是添加一个抽象层。不要让您的 Save 方法直接处理 XmlWriter。相反,创建包装器,每个包装器都能够将数据的小逻辑块保存到 xml,并对其进行测试。
对于每个 Wrapper 都有一个类似的方法
void Persist(XmlWriter writer);
让 Save 只从包装器中收集数据。换句话说,正确保存数据是 Wrappers 的责任,但每个人只负责其中的一小部分。在那里你可以通过比较字符串来测试它(将 StringWriter 放入 XmlWriter 你传递给 Persist 方法)
选项
这就是我所做的——它对我有用,但可能不符合您的要求。
在拆解过程中,我确保删除了我可能作为套件的一部分创建的所有文件。所以是的,确保该文件是一个临时文件,仅用于测试
在测试方法中,如果文件存在,我将其删除(它不应该因为拆解已经处理了它),然后将文件输出到 XML,然后断言文件存在。然后,我将文件重新加载到对象图或 xml DOM 中,并根据需要通过尽可能多的断言查询状态。
如果您可以避免写入文件并且您的设计允许您写入通用文本写入器或 xml 写入器,那么您可以绕过文件保存并用字符串写入器替换调用,而只需查询一个字符串。更干净,但它没有测试实际的文件持久性是否有效。
设计你的类,使你有 SaveFile(string fileName) 和 SaveFile(XmlWriter writer)。SaveFile(string filename) 只需要为命名文件创建一个 XmlWriter 并调用 SaveFile(writer)。对可以使用模拟 XmlWriter 的 SaveFile(XmlWriter writer) 方法进行广泛的单元测试。在 SaveFile(string filename) 方法上测试一些错误条件——如果您希望处理它们而不是向上传播它们。根据错误处理,您可能根本不需要创建文件。
顺便说一句,如果您不想,则不需要直接使用 XmlWriter 公开您的方法。您可以将其设为私有并使用访问器在您的测试中调用它。