2017-01-31 37 views
1

使用another answer概括我的技術是能夠寫一個測試爲--help開關:捕獲輸出和錯誤測試的Node.js CLI

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

的解決方案是在測試移動到另一個文件。

有沒有更好的方法來做我想要的?我想要做的就是在測試stdout,stderr和退出狀態時反覆運行我的可執行文件。

回答

0

不回答你的整個問題,但你缺少return語句

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