11
具有文件系统依赖性的单元测试代码
我正在编写一个组件,给定一个ZIP文件,该组件需要: 解压缩文件。 在解压缩的文件中找到一个特定的dll。 通过反射加载该dll并在其上调用方法。 我想对该组件进行单元测试。 我很想编写直接处理文件系统的代码: void DoIt() { Zip.Unzip(theZipFile, "C:\\foo\\Unzipped"); System.IO.File myDll = File.Open("C:\\foo\\Unzipped\\SuperSecret.bar"); myDll.InvokeSomeSpecialMethod(); } 但是人们经常说:“不要编写依赖于文件系统,数据库,网络等的单元测试。” 如果我以对单元测试友好的方式编写此代码,我想它看起来应该像这样: void DoIt(IZipper zipper, IFileSystem fileSystem, IDllRunner runner) { string path = zipper.Unzip(theZipFile); IFakeFile file = fileSystem.Open(path); runner.Run(file); } 好极了!现在可以测试了;我可以将测试双打(模拟)输入DoIt方法。但是要花多少钱呢?我现在必须定义3个新接口才能使其可测试。我到底在测试什么?我正在测试我的DoIt函数与其依赖项正确交互。它无法测试zip文件是否已正确解压缩,等等。 感觉好像我不再在测试功能。感觉就像我只是在测试课堂互动。 我的问题是:对依赖于文件系统的内容进行单元测试的正确方法是什么? 编辑我正在使用.NET,但是该概念也可以应用Java或本机代码。