javascript - 我如何 stub fs 回调的注入(inject)参数以消除在测试套件中接触文件系统的需要?

标签 javascript node.js asynchronous stub sinon

我使用 Chai、Mocha 和 Sinon 作为我的测试框架。

现在,我对此工作进行了测试,但实际上我必须创建一个目录并将文件放入其中以使我的测试真正执行某些操作(这将是一个大型测试套件,因此使用所有这些进行操作至少可以说,diskIO 并不理想)。如何停止注入(inject)机制,以便在测试中不必接触磁盘?

我在想,在下面的示例代码中,有某种方法可以对 fs.readdir 方法注入(inject)的 errfiles 参数进行 stub 处理。这样,我就可以避免在单元测试中测试 fs.readdir 。我进行了一些谷歌搜索并查看了 API 文档,但没有找到我需要的内容(或者无法识别它)。

这是我正在讨论的一些示例代码:

正在测试的功能

function fsFxnWrapper(dir, callback) {
  var doSomeMutation = function (files) {
    ...
  };

  fs.readdir(dir, function(err, files) {
    callback(err, doSomeMutation(files));
  });
}

示例测试用例

describe('When the directory has things'', function () {
  before(function () {
    ...
  });

  after(function () {
    ...
  });

  // I'm not sure how to write my stubs so that fs.readdir inside of the
  // fsFxnWrapper doesn't have to go out to the filesystem to retrieve something...
  it('should do the proper mutation on the files list', function () {
    var valueAfterMutation = [ /* the expected answer */];
    fsFxnWrapper('test/dir', function (err, files) {
      expect(files).to.deep.equal(valueAfterMutation);
      expect(err).to.equal(null);
    });
  });
});

最佳答案

如果您在 Node.js 下工作,您可能会考虑一些模拟库:node-mocks , mock-fs

关于javascript - 我如何 stub fs 回调的注入(inject)参数以消除在测试套件中接触文件系统的需要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28731628/

相关文章:

javascript - 覆盖原型(prototype)属性或函数

javascript - 如何降级Webpack版本?

javascript - 使用node.js在ol3中绘制特征

linux - 由在 docker 中运行的 Jenkins 触发的 npm 测试输出中的编码损坏

javascript - 循环数组并检查循环中的 MongoDB 集合(异步)

ios - 如何在执行函数之前等待 Swift 中的变量?

javascript - 销毁之前的setInterval

Javascript通过对象的属性更新数组对象

node.js - 在 Node js 单元测试的请求中设置 session

c# - 如何使用 async 和 await 发出大量并发 Web 请求?