Created
November 8, 2011 21:56
-
-
Save bsatrom/1349384 to your computer and use it in GitHub Desktop.
Samples for hooking into STDOUT for unit testing in Node.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
exports = module.exports | |
exports.setup = (callback) -> | |
write = process.stdout.write | |
process.stdout.write = ((stub) -> | |
(string, encoding, fd) -> | |
stub.apply process.stdout, arguments | |
callback string, encoding, fd)(process.stdout.write) | |
return -> process.stdout.write = write |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var exports = module.exports; | |
exports.setup = function(callback) { | |
var write = process.stdout.write; | |
process.stdout.write = (function(stub) { | |
function(string, encoding, fd) { | |
stub.apply(process.stdout, arguments); | |
callback(string, encoding, fd); | |
}; | |
})(process.stdout.write); | |
return function() { | |
process.stdout.write = write; | |
}; | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
exports = module.exports | |
# server logic omitted for brevity | |
exports.listen = (port, host, callback) -> | |
try | |
server.listen port, host, callback | |
util.log "Server listening at http://#{host or "127.0.0.1"}:#{port}/" | |
catch err | |
util.log err.message |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var exports; | |
exports = module.exports; | |
exports.listen = function(port, host, callback) { | |
try { | |
server.listen(port, host, callback); | |
return util.log("Server listening at http://" + (host || "127.0.0.1") + ":" + port + "/"); | |
} catch (err) { | |
return util.log(err.message); | |
} | |
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
server = require '../js/server' | |
hook = require '../js/hook_stdout' | |
describe 'chat server', -> | |
it 'should listen at localhost on a port I specify', -> | |
unhook = hook.setup((string, encoding, fd) -> | |
expect(string).toContain 'Server listening at http://127.0.0.1:3001/' | |
) | |
server.listen '3001' | |
unhook() |
@mklement0 I'm also looking for solutions to stdio: 'inherit'
. Did you find any?
@satazor and @mklement0 it is missing a return
var exports = module.exports;
exports.setup = function(callback) {
var write = process.stdout.write;
process.stdout.write = (function(stub) {
//bug fix
return function(string, encoding, fd) {
stub.apply(process.stdout, arguments);
callback(string, encoding, fd);
};
})(process.stdout.write);
return function() {
process.stdout.write = write;
};
};
# this isn't necessary:
# exports = module.exports
exports.setup = (callback) ->
write = process.stdout.write
# use `do` to immediately call a function
process.stdout.write = do (stub = write) ->
(string, encoding, cb) ->
stub.apply process.stdout, arguments
callback string, encoding, cd
# fix the indentation here, add an empty return
return -> process.stdout.write = write ; return
Alternate version:
exports.setup = (callback) ->
write = process.stdout.write
# no need to do the double step above, this works:
process.stdout.write = (string, encoding, cb) ->
write.apply process.stdout, arguments
callback string, encoding, cb
-> process.stdout.write = write ; return
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Great stuff, thanks for sharing; there are problems, though:
hook_stdout.coffee
won't compile, because it contains an unexpected indent on the last linehook_stdout.js
won't compile, because it is missing tworeturn
statements to make it the direct translation of its.coffee
sourceWhile your technique works great for writes performed by the process itself, it doesn't for writes from child processes created with
spawn
and{ stdio: 'inherit' }
. Any idea how to fix that?