【问题标题】:Unittesting methods that contain Filesystem calls包含文件系统调用的单元测试方法
【发布时间】:2010-09-27 02:55:25
【问题描述】:

我有一个我想对其中包含文件系统调用的方法进行单元测试,我想知道如何去做。我看过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 方法创建某种包装器?

【问题讨论】:

    标签: unit-testing file-io


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      编辑我在你将 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 实现;

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-03
        • 2017-07-24
        • 2010-09-26
        • 1970-01-01
        • 2011-10-04
        • 2018-08-07
        • 2011-01-15
        相关资源
        最近更新 更多