All of those suggestions involve changing the way you write the code in your module in order to do your tests. This is problematic because: a) When you go back and write code later, you may forget to call exports.doSomething and put in a call to just doSomething() b) You lose useful linting (e.g. if I type exports.doSoemthing() linters won't complain about it, my editor won't immediately highlight it as a typo, etc, as opposed to just doSoemthing(), which linters will complain does not exist).
If I'm mocking out an internal function for testing, I tend to go with the following pattern, which I can add once and then forget about and write Javascript like normal: function doSomething(req,res) { console.log('internal'); } function doSomethingElse(req,res) { doSomething(req,res); } exports.doSomething=doSomething; // Expose overriding a method for testing function overrideDoSomething(new_func) { exports.doSomething = doSomething = new_func; } exports.overrideDoSomething = overrideDoSomething; The same paradigm works for overriding internal-only functions without ever exporting the original internal function. May also need to also save original functions and expose a resetOverrides() function for cleanup depending on your use case. On Wednesday, March 11, 2015 at 11:56:06 AM UTC-7, Ken wrote: > > You don't actually need a new object (exports already is one), but you do > need to make sure within your module you reference exports's attribute that > points to the function, rather than referencing the function by name, e.g. > > function doSomething() { ... } > exports.doSomething = doSomething; > > exports.doSomethingElse = function () { > // doSomething(); // this will always call the local function > exports.doSomething(); // calls the exported function, which can be > overwritten > } > > In practice if doSomething is a function that generally you'd expect to be > private to the module and only need to override under special > circumstances I'd recommend either giving it a weird prefix (e.g. > _doSomething) or embedding it in a sub-object, e.g. > > var private = { > doSomething: function () { ... } > }; > exports.private = private; // export private methods for testing > > exports.doSomethingElse = function () { private.doSomething(); } > > Then when you're overriding it it will be more obvious that this is an odd > thing to do > > var myMod = require("myMod); > > myMod.private.doSomething = function () { ... }; // override private > doSomething method > > If you wanted to get fancy you could even make the private export > conditional on environment e.g. > > if (process.env.NODE_ENV === "development") { > exports.private = private; // export private methods for testing > } > > On Tuesday, March 10, 2015 at 8:14:41 AM UTC-7, zladuric wrote: >> >> Your module holds internally to the reference of the internal function. >> Furthermore, it doesn't even know about the external one. >> >> So it means your doSomethingElse needs to address the proper function >> reference, like override the prototype or use some closure object. >> >> You can try something like this: >> >> `myMod.js` >> >> function doSomething() { >> >> console.log('internal'); >> } >> function callSomething() { >> obj.doSomething(); >> } >> var obj = { >> >> doSomething: doSomething, >> callSomething: callSomething >> }; >> >> module.exports = obj; >> >> >> Module usage: >> >> zlatko@localhost:~/tmp$ node >> > var m = require('./mod') >> >> > m.doSomething() >> internal >> >> > m.callSomething() >> internal >> >> > m.doSomething = function() {console.log('external');} >> [Function] >> > m.callSomething() >> external >> >> >> The alternative would be that you override the module prototype once you >> load it. >> >> Zlatko >> >> >> On Monday, March 9, 2015 at 4:39:58 AM UTC+1, MC wrote: >>> >>> Hello, >>> I'm trying to override function implementation where original function >>> is part of nodejs module (myMod.js): >>> 'use strict'; >>> function doSomething(req,res) { >>> console.log('internal'); >>> } >>> function doSomethingElse(req,res) { >>> doSomething(req,res); >>> } >>> module.exports.doSomething=doSomething; >>> >>> I can override doSomething from the outside: >>> var myMod = require('myMod.js'); >>> myMod.doSomething = function(req,res) { >>> console.log('external'); >>> }; >>> >>> And when I call doSomething new implementation is used (prints >>> 'external'). >>> But when I call doSomethingElse it still prints 'internal' - it looks >>> like inside the module original implementation is used. >>> >>> I saw a post that suggested declaring a variable (inside module): >>> var doSomehing = module.exports.doSomething = doSomething; >>> >>> But using that didn't help. >>> Any suggestions on how to replace doSomething so that calling >>> doSomethingElse prints 'external'? >>> Thanks, >>> >>> M >>> >>> -- Job board: http://jobs.nodejs.org/ New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscr...@googlegroups.com. To post to this group, send email to nodejs@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/b1dbf5bc-66e9-49ae-afd0-4d5607118118%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.