【发布时间】:2013-01-02 11:31:42
【问题描述】:
我正在构建一个小命令行工具,但在测试时遇到了问题。
如何测试当前进程在stderr中写了“omg”?
process.stderr.write("omg")
【问题讨论】:
标签: javascript node.js testing io tdd
我正在构建一个小命令行工具,但在测试时遇到了问题。
如何测试当前进程在stderr中写了“omg”?
process.stderr.write("omg")
【问题讨论】:
标签: javascript node.js testing io tdd
如果你还没有安装 Mocha:
npm install -g mocha
shouldpass.js:
process.stderr.write('omg')
应该失败.js:
process.stdout.write('not omg on stderr')
test.js:
var exec = require('child_process').exec
, assert = require('assert')
describe('run tests', function(){
it('should pass', function(done) {
exec('node ./shouldpass.js', function(err, stdout, stderr) {
assert.equal(stderr, 'omg')
done()
})
})
it('should fail', function(done) {
exec('node ./shouldfail.js', function(err, stdout, stderr) {
assert.equal(stderr, 'omg')
done()
})
})
})
运行:
mocha test.js
【讨论】:
您可以临时覆盖process.stdout.write,缓冲输入并使用console.error 打印输出(console.log 将在process.stdout.write 被覆盖时不起作用),例如
describe('process.stdout', () => {
let processStdoutWrite,
processStdoutWriteBuffer,
overwriteProcessStdoutWrite,
resetProcessStdoudWrite,
getProcessStdoutBuffer;
/**
* @var {function} Reference to the original process.stdout.write function.
*/
processStdoutWrite = process.stdout.write;
/**
* @returns {undefined}
*/
overwriteProcessStdoutWrite = () => {
processStdoutWriteBuffer = '';
process.stdout.write = (text) => {
processStdoutWriteBuffer += text;
};
};
/**
* @returns {string}
*/
getProcessStdoutBuffer = () => {
return processStdoutWriteBuffer;
};
/**
* @returns {undefined}
*/
resetProcessStdoudWrite = () => {
process.stdout.write = processStdoutWrite;
};
beforeEach(() => {
overwriteProcessStdoutWrite();
});
afterEach(() => {
resetProcessStdoudWrite();
});
describe('.write()', () => {
it('prints "foo"', () => {
process.stdout.write('foo');
process.stdout.write('bar');
console.error(getProcessStdoutBuffer());
});
});
});
【讨论】: