如何在测试期间存根 node.js 内置 fs? [英] How do I stub node.js built-in fs during testing?

查看:21
本文介绍了如何在测试期间存根 node.js 内置 fs?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想存根 node.js 像 fs 这样的内置函数,这样我就不会真正进行任何系统级文件调用.我唯一能想到的就是将 fs 和所有其他内置函数作为参数传递给我的所有函数,以避免使用真正的 fs.这似乎有点愚蠢,并创建了一个冗长的函数签名,其中包含内置函数作为参数.

I want to stub node.js built-ins like fs so that I don't actually make any system level file calls. The only thing I can think to do is to pass in fs and all other built-ins as an argument to all of my functions to avoid the real fs from being used. This seems a little bit silly and creates a verbose function signature crowded with built ins as arguments.

var fs = require('fs');

function findFile(path, callback) {
  _findFile(fs, path, callback);
}

function _findFile(fs, path, callback) {
  fs.readdir(path, function(err, files) {
     //Do something.
  });
}

然后在测试期间:

var stubFs = {
  readdir: function(path, callback) {
     callback(null, []);
  }
};

_findFile.(stubFs, testThing, testCallback);

还有比这更好的方法吗?

There's a better way than this right?

推荐答案

我喜欢使用 rewire 进行 stubbing输出 require(...) 语句

I like using rewire for stubbing out require(...) statements

module-a.js

module-a.js

var fs = require('fs')
function findFile(path, callback) {
  fs.readdir(path, function(err, files) {
     //Do something.
  })
}

测试代码

module-a-test.js

Test Code

module-a-test.js

var rewire = require('rewire')
var moduleA = rewire('./moduleA')
// stub out fs
var fsStub = {
  readdir: function(path, callback) {
     console.log('fs.readdir stub called')
     callback(null, [])
  }
}
moduleA.__set__('fs', fsStub)
// call moduleA which now has a fs stubbed out
moduleA()

这篇关于如何在测试期间存根 node.js 内置 fs?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆