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

标签 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 block ,例如 --version,那么我会收到以下错误:Error: done() called多次

解决方案是将测试移动到另一个文件中。

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

最佳答案

不要回答你的整个问题,但你缺少返回声明

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

关于node.js - 捕获 stdout 和 stderr 以测试 Node.js CLI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41949722/

相关文章:

ubuntu - 如何在 ubuntu 上使用 veracrypt 更改密码?

command-line-interface - 如何查看PCF版本

node.js - find后确定鉴别器类型的正确方法

javascript - 无法正确访问 NODE_ENV 环境变量,这是 node.js 的错误吗?

javascript - Node.js 服务器/客户端模块困惑,EventEmitter 问题

node.js - 在 node.js 中执行并获取 shell 命令的输出

node.js - 如何使用 Electron 运行和打包外部可执行文件?

ms-access - 如何在 MS Access 中设置开发环境

测试新的 Google reCAPTCHA v3

testing - 如何在运行时获取测试环境