包含文件系统调用的单元测试方法

Fad*_*oof 4 file-io unit-testing

我有一个方法,我想单元测试,其中有文件系统调用,我想知道如何去做.我已经查看了具有文件系统依赖性的单元测试代码,但它没有回答我的问题.

我正在测试的方法看起来像这样(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在模拟Transform(..)方法不向文件输出任何内容,因为我正在对Process方法进行单元测试而不是Transform(..)方法,因此不存在output.txt文件.因此if检查失败.

我该怎么做呢?我应该在文件io周围创建一些包装器,我也会模拟出来吗?

Dan*_*ton 5

编辑我在你添加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...
    }
}
Run Code Online (Sandbox Code Playgroud)

这是依赖注入的一个例子- 一种易于测试的常见模式:

  • 在测试时,您可以使用像NMock这样的模拟框架来模拟测试FileProvider实现;

  • 在运行时,您只需插入实际的实现.