我正在编写一个组件,给定一个 ZIP 文件,它需要:
我想对这个组件进行单元测试。
我很想编写直接处理文件系统的代码:
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);
}
耶!现在它是可测试的; 我可以将 test double (mock)提供给 DoIt 方法。但代价是什么?我现在必须定义3个新的接口来使这个接口具有可测试性。我到底在测试什么?我正在测试我的 DoIt 函数是否与它的依赖项正确地交互。它不会测试压缩文件是否被正确解压,等等。
我感觉不再是在测试功能,而是在测试类交互。
我的问题是这样的 : 对依赖于文件系统的东西进行单元测试的正确方法是什么?
编辑 我正在使用.NET,但是这个概念也可以应用 Java 或本机代码。