3

我正在构建一个小命令行工具,但遇到了测试问题。

如何测试当前进程在中写入“omg” stderr

process.stderr.write("omg")
4

2 回答 2

5

如果您还没有安装 Mocha:

npm install -g mocha

应该通过.js:

process.stderr.write('omg')

应该失败.js:

process.stdout.write('not omg on stderr')

测试.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
于 2013-01-18T19:50:45.240 回答
0

您可以临时覆盖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());
        });
    });
});
于 2015-10-05T09:44:03.143 回答