捕获stdout和stderr以测试Node.js CLI

时间:2017-01-31 04:37:53

标签: node.js testing command-line-interface chai

使用another answer中概述的技术,我能够为--help开关编写测试:

const expect = require('chai').expect
const exec = require('child_process').exec
const cli = './cli.js'

describe('help', function () {
  var capturedStdout
  var capturedStderr
  // http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
  // var cmd = cli + " --help 1>&2"
  var cmd = cli + ' --help'

  before(function (done) {
    exec(cmd, function (error, stdout, stderr) {
      if (error) done(error)
      capturedStdout = stdout
      capturedStderr = stderr
      done()
    })
  })

  it('should succeed', () => {
    expect(capturedStderr).be.empty
  })

  it('should have some usage instructions', () => {
    expect(capturedStdout).to.match(/Usage: words \[options] \[pattern]/)
  })

  it('should show a sematic version number', () => {
    // http://rubular.com/r/lTC1wu95jq
    expect(capturedStdout).to.match(/v\d+\.\d+\.\d+/)
  })

  it('should have some examples', () => {
    expect(capturedStdout).to.match(/Examples:/)
  })
})

我有两个问题:

  1. 一个开关的长度为45行。
  2. 如果我为其他交换机添加了另一个describe块,例如--version,则会收到以下错误:Error: done() called multiple times
  3. 解决方案是将测试移到另一个文件中。

    有没有更好的方法来做我想要的?我想要做的就是在测试stdout,stderr和退出状态时重复运行我的可执行文件。

1 个答案:

答案 0 :(得分:0)

不回答你的整个问题,但你错过了一个回复陈述

before(function (done) {
    exec(cmd, function (error, stdout, stderr) {
      if (error) { 
        return done(error)
      }