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

时间:2008-12-16 10:28:42

标签: unit-testing file-io

我有一个我想要单元测试的方法,其中有文件系统调用,我想知道如何去做。我看过Unit testing code with a file system dependency,但它没有回答我的问题。

我正在测试的方法看起来像这样(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周围创建一些包装器,我也会模拟出来吗?

2 个答案:

答案 0 :(得分: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...
    }
}

这是dependency injection的一个例子 - 一种易于测试的常见模式:

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

  • 在运行时,您只需插入真实的实现。

答案 1 :(得分:0)

我认为你应该创建两个文件:一个文件长度为零,另一个文件包含一些数据。 然后,您应该对每个文件进行测试。在准备阶段,您应该将给定文件复制到测试目录,运行测试,并在断言文件是否存在之后。