我有一个方法ExportXMLFiles(string path)
导出xml文件在一定的路径,其中的一些元素像FirstName,LastName,MajorSubject。这些值从数据库中获取。导出XML方法的单元测试
现在我需要为它编写单元测试方法,除了简单和直接的单元测试之外,我还没有进行过很多单元测试。我的困惑是,我是否需要连接数据库并创建一个XML文件,或者是否需要在创建XML文件时传递硬编码值,以便验证XML中创建的值?
有没有其他方法可以做到这一点?
我有一个方法ExportXMLFiles(string path)
导出xml文件在一定的路径,其中的一些元素像FirstName,LastName,MajorSubject。这些值从数据库中获取。导出XML方法的单元测试
现在我需要为它编写单元测试方法,除了简单和直接的单元测试之外,我还没有进行过很多单元测试。我的困惑是,我是否需要连接数据库并创建一个XML文件,或者是否需要在创建XML文件时传递硬编码值,以便验证XML中创建的值?
有没有其他方法可以做到这一点?
单元测试的范围应该很小,并且与相关性(例如数据库和文件系统)隔离。所以你想要做的就是嘲笑数据库访问以及写入文件的内容,这样你就可以在不需要数据库中的特定值的情况下运行你的测试。单元测试应该快速运行,具有可重复的结果(即运行两次,得到相同的答案),与其他测试隔离并能够以任何顺序运行。
单元测试正在研究一项功能,而不依赖于其他任何行为。
因此,请看使用依赖注入等模式,以便您可以提供(即注入)数据库和文件系统依赖关系。看一下像NMock这样的模拟框架,或者编写自己的实现与依赖相同接口的轻量假对象,然后将这些对象传递给正在测试的函数。
这种方法的责任是什么? 是否以特定路径以xml文件的形式转储给定的数据?如果是的话,那么你必须检查文件是否被创建。
这不是一个单元测试,而是一个集成测试(因为这是您的应用程序和文件系统之间的边界)。您应该通过接口/角色抽象出输入数据源(数据库)。你也可以创建一个角色CreateXmlFile(内容),但我认为这是矫枉过正。
// setup mock data source to supply canned data
// call myObject.ExportToXml(mockDataSource, tempPath)
// verify files are created in tempPath
最后这一类需要实现角色(DataExporter),以便使用DataExporter测试的速度快/没有处理的文件系统(或XML)。