Bjorn Tipling Bjorn Tipling - 2 months ago 12
Javascript Question

How do I stub node.js built-in fs during testing?

I searched the site because I assumed this question must have been asked already but came up empty.

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.
});
}


And then during testing:

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

_findFile.(stubFs, testThing, testCallback);


There's a better way than this right?

Answer

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

Module Under test

module-a.js

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

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()
Comments