diff --git a/lib/mm.js b/lib/mm.js index 1f6aeee..acc5580 100644 --- a/lib/mm.js +++ b/lib/mm.js @@ -14,7 +14,8 @@ var EventEmitter = require('events').EventEmitter; var muk = require('muk'); var http = require('http'); var https = require('https'); - +var cp = require('child_process'); +var EventEmitter = require('events').EventEmitter; exports = module.exports = function mock(obj, key, method) { return muk.apply(null, arguments); @@ -305,6 +306,25 @@ function _requestError(mod, url, reqError, resError, delay) { return this; } +/** + * mock child_process spawn + * @param {Integer} code exit code + * @param {String} stdout + * @param {String} stderr + * @param {Integer} timeout stdout/stderr/close event emit timeout + */ +exports.spawn = function (code, stdout, stderr, timeout) { + var evt = new EventEmitter(); + muk(cp, 'spawn', function () { + return evt; + }); + setTimeout(function () { + stdout && evt.emit('stdout', stdout); + stderr && evt.emit('stderr', stderr); + evt.emit('close', code); + }, timeout); +}; + /** * remove all mock effects. */ diff --git a/test/mm.test.js b/test/mm.test.js index 67dd568..915caac 100644 --- a/test/mm.test.js +++ b/test/mm.test.js @@ -16,10 +16,10 @@ var fs = require('fs'); var should = require('should'); var http = require('http'); var https = require('https'); +var child_process = require('child_process'); var pedding = require('pedding'); var foo = require('./foo'); - describe('mm.test.js', function () { var port = null; @@ -524,6 +524,32 @@ describe('mm.test.js', function () { }); + describe('spawn', function () { + it('should mm.spawn mock spawn', function (done) { + mm.spawn(1, 'stdout', 'stderr', 100); + var ls = child_process.spawn('ls', ['-a']); + var done = pedding(4, done); + ls.on('stdout', function (data) { + data.should.equal('stdout'); + done(); + }); + ls.on('stderr', function (data) { + data.should.equal('stderr'); + done(); + }); + ls.on('close', function (code) { + code.should.equal(1); + done(); + }); + mm.restore(); + var ls = child_process.spawn('ls', ['-a']); + ls.on('close', function (code) { + code.should.equal(0); + done(); + }); + }); + }); + describe('mm()', function () { it('should mm() just like muk()', function (done) { mm(fs, 'readFile', function (filename, callback) {