Behaviour-driven node.js development with stubbing by combining Vows and node-gently
I’m about 3.5 hours into node.js development, I guess that qualifies me to give advice on it on this Internet thing.
Being the BDD fanatic that I am, I wanted to start off behaviour-driven right from the beginning, and Vows looked like a good choice.
However, I quickly came to the point where I needed to stub out a dependency in one of my modules, and as far as I can see, Vows doesn’t provide mocking/stubbing. But https://github.com/felixge/node-gently does, and here is my approach at combining these two:
This is the Vows spec:
var gently = global.GENTLY = new (require("gently"));
var vows = require("vows"),
assert = require("assert");
var myModule = require("MyModule");
vows.describe("My Module").addBatch({
"when calling its foo() method": {
topic: myModule,
"it triggers a console message": function (topic) {
gently.expect(gently.hijacked.sys, "puts", function(str) {
assert.equal(str, "Hello World");
});
topic.foo("Hello World");
}
}
}).export(module);
And this is the implementation of MyModule:
if (global.GENTLY) require = GENTLY.hijack(require);
var sys = require("sys");
function foo(message) {
sys.puts(message);
return true;
}
exports.foo = foo;
No idea if this makes any sense in the long run – I will tell you when I’m about 14 hours or so into BDD node.js development…