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

标签 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 方法创建某种包装器吗?

最佳答案

编辑 我在你将 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执行;
  • 在运行时,您只需插入真正的实现即可。
  • 关于unit-testing - 包含文件系统调用的单元测试方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/370925/

    相关文章:

    此代码的 Java 适当 I/O 为空终止字符

    java - 如何使用 Mockito 模拟带有自定义注释的类?

    javascript - sinon:如何模拟从另一个函数返回的函数

    node.js - 如何用 Jest 设置媒体查询?

    java - 如何在 Espresso 中重新运行失败的测试? - 头脑 Storm

    java - 打开远程文件并写入

    c# - 通过访问数据库来测试 Entity Framework 数据

    c++ - 连接文件而不复制其内容

    java - 如何询问用户文件名,然后扫描文件夹中的特定类型,如果为 true,则打开文件名,如果不是,则抛出错误

    c# - File.Copy 和 File.Move 的区别