2008-12-16 96 views
4

我有一个方法,我想单元测试有文件系统调用,并且想知道如何去做。我看过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); 
    } 
} 

我嘲讽的变换(..)方法,以正常输出到文件,因为我单元测试过程的方法,而不是转换(..)方法,因此不存在output.txt文件。因此,如果检查失败。

我该如何正确地做到这一点?我是否应该在文件io方法上创建某种包装类型,我也会模拟出来?

回答

0

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

5

编辑我回答你加入C#的问题之前(或我错过了...),所以我的答案是一个小的Java式的,但原理是一样的...


你对文件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的实现;

  • 在运行时你只需插入真正的实现。

相关问题