C# 导出XML方法的单元测试
我有一个方法C# 导出XML方法的单元测试,c#,unit-testing,c#-4.0,nunit,C#,Unit Testing,C# 4.0,Nunit,我有一个方法ExportXMLFiles(stringpath)以特定路径导出xml文件,其中包含一些元素,如FirstName、LastName、MajorSubject。这些值是从数据库中选取的 现在我需要为它编写一个单元测试方法,除了简单和直接的单元测试之外,我没有做过很多单元测试。我的困惑是,我需要连接到数据库并创建一个XML文件,还是需要在创建XML文件时传递硬编码的值,以便验证创建的XML中的值 还有其他方法吗?您绝对不希望在单元测试中使用实际的数据库。它增加了一个您不想在单元测试中
ExportXMLFiles(stringpath)
以特定路径导出xml文件,其中包含一些元素,如FirstName、LastName、MajorSubject。这些值是从数据库中选取的
现在我需要为它编写一个单元测试方法,除了简单和直接的单元测试之外,我没有做过很多单元测试。我的困惑是,我需要连接到数据库并创建一个XML文件,还是需要在创建XML文件时传递硬编码的值,以便验证创建的XML中的值
还有其他方法吗?您绝对不希望在单元测试中使用实际的数据库。它增加了一个您不想在单元测试中处理的复杂性级别。它还会降低单元测试的可靠性和速度。看看是否可以将数据库功能分解为一个可以使用模拟框架实例化的接口。如果这还不够的话,试着去微软看看
编辑-另一篇文章提到,如果功能是写入磁盘,那么单元测试应该验证文件是否已写入磁盘。使用Moles,您可以模拟文件系统,测试文件系统调用,模拟写入失败或任何其他需要的情况,这将比实际写入磁盘提供更大的灵活性和速度。如果没有moles之类的东西,像磁盘写入失败这样的测试将是痛苦的。单元测试的范围应该很小,并且与数据库和文件系统等依赖项隔离开来。因此,您要做的是模拟数据库访问以及写入文件的内容,这样您就可以在不需要数据库中的特定值的情况下运行测试。单元测试应该快速运行,具有可重复的结果(即运行两次,得到相同的答案),与其他测试隔离,并且能够以任何顺序运行 单元测试是查看一项功能,而不是依赖于其他任何功能的行为
因此,请考虑使用依赖项注入等模式,以便提供(ie注入)数据库和文件系统依赖项。查看一个模拟框架,比如NMock,或者编写自己的轻量级伪对象,这些伪对象实现与依赖项相同的接口,然后您可以将它们传递到正在测试的函数中 这种方法的责任是什么? 是否将给定数据以xml文件的形式转储到特定路径?如果是,则必须检查文件是否已创建 这不是一个单元测试,而是一个集成测试(因为这个类位于应用程序和文件系统之间的边界)。您应该通过接口/角色抽象出输入数据源(DB)。您也可以创建一个角色来创建XMLFile(内容),但我认为这太过分了
// setup mock data source to supply canned data
// call myObject.ExportToXml(mockDataSource, tempPath)
// verify files are created in tempPath
最后,这个类需要实现一个角色(DataExporter),以便使用DataExporter的测试快速/不必处理文件系统(或XML)