如何在测试期间存根 node.js 内置 fs? [英] How do I stub node.js built-in fs during testing?
问题描述
我想存根 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屋!