2012-02-15 78 views
1

我有一个方法ExportXMLFiles(string path)导出xml文件在一定的路径,其中的一些元素像FirstName,LastName,MajorSubject。这些值从数据库中获取。导出XML方法的单元测试

现在我需要为它编写单元测试方法,除了简单和直接的单元测试之外,我还没有进行过很多单元测试。我的困惑是,我是否需要连接数据库并创建一个XML文件,或者是否需要在创建XML文件时传递硬编码值,以便验证XML中创建的值?

有没有其他方法可以做到这一点?

回答

2

你绝对不想在单元测试中使用实际的数据库。它增加了一个你不想在单元测试中处理的复杂性。这也会让你的单元测试更不可靠和更慢。查看是否可以将数据库功能分解为可以使用模拟框架实例化的接口。尝试寻找moq之类的东西,或者如果这还不够,请查看微软的moles

编辑 - 另一篇文章提到,如果功能是写入磁盘,那么你的单元测试应该验证文件已写入磁盘。通过使用Moles,您可以模拟文件系统并测试文件系统调用,并模拟写入失败或任何其他需要的情况,这会比实际写入磁盘更灵活和快速。像磁盘写入失败这样的事情将是悲惨的测试没有像痣。

0

单元测试的范围应该很小,并且与相关性(例如数据库和文件系统)隔离。所以你想要做的就是嘲笑数据库访问以及写入文件的内容,这样你就可以在不需要数据库中的特定值的情况下运行你的测试。单元测试应该快速运行,具有可重复的结果(即运行两次,得到相同的答案),与其他测试隔离并能够以任何顺序运行。

单元测试正在研究一项功能,而不依赖于其他任何行为。

因此,请看使用依赖注入等模式,以便您可以提供(即注入)数据库和文件系统依赖关系。看一下像NMock这样的模拟框架,或者编写自己的实现与依赖相同接口的轻量假对象,然后将这些对象传递给正在测试的函数。

0

这种方法的责任是什么? 是否以特定路径以xml文件的形式转储给定的数据?如果是的话,那么你必须检查文件是否被创建。

这不是一个单元测试,而是一个集成测试(因为这是您的应用程序和文件系统之间的边界)。您应该通过接口/角色抽象出输入数据源(数据库)。你也可以创建一个角色CreateXmlFile(内容),但我认为这是矫枉过正。

// setup mock data source to supply canned data 
// call myObject.ExportToXml(mockDataSource, tempPath) 
// verify files are created in tempPath 

最后这一类需要实现角色(DataExporter),以便使用DataExporter测试的速度快/没有处理的文件系统(或XML)。