【问题标题】:How to assert process.stderr output?如何断言 process.stderr 输出?
【发布时间】:2013-01-02 11:31:42
【问题描述】:

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

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

process.stderr.write("omg")

【问题讨论】:

    标签: javascript node.js testing io tdd


    【解决方案1】:

    如果你还没有安装 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
    

    【讨论】:

      【解决方案2】:

      您可以临时覆盖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());
              });
          });
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-12
        • 2021-08-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-03
        相关资源
        最近更新 更多