我有一个方法,我想单元测试,其中有文件系统调用,我想知道如何去做.我已经查看了具有文件系统依赖性的单元测试代码,但它没有回答我的问题.
我正在测试的方法看起来像这样(c#)
public void Process(string input) { string outputFile = "output.txt"; this.Transform(input, Resources.XsltFile, outputFile); if ((new FileInfo(outputFile)).Length == 0) { File.Delete(outputFile); } }
我正在模拟Transform(..)方法不向文件输出任何内容,因为我正在对Process方法进行单元测试而不是Transform(..)方法,因此不存在output.txt文件.因此if检查失败.
我该怎么做呢?我应该在文件io周围创建一些包装器,我也会模拟出来吗?
编辑我在你添加C#之前回答了问题(或者我错过了它)所以我的答案有点像java-esque,但原则是一样的......
你对文件IO包装器的想法很好.这是一个这样的例子,但类似的任何东西都可以:
interface FileProvider { public Reader getContentReader(String file); // notice use of the Reader interface // - real-life returns a FileReader; // - testing mock returns a StringReader; public FileInfo getFileInfo(String path); // easy to mock out... } class Processor { private FileProvider fileProvider; public void setFileProvider(FileProvider provider) { this.provider = provider; } public void process(String input) { // use this.fileProvider for all filesystem operations... } }
这是依赖注入的一个例子- 一种易于测试的常见模式:
在测试时,您可以使用像NMock这样的模拟框架来模拟测试FileProvider
实现;
在运行时,您只需插入实际的实现.