2014-02-19 58 views
0

黃瓜JS child_process我嘗試寫一些CucumberJS功能,這將考驗我創建的NodeJS命令行應用程序,但是我遇到了能夠要素步內執行child_process問題。在功能步

只是爲了得到一個概念證明工作我試圖執行ls -l命令。

我有的代碼是;

var ChildProcess = require('child_process'); 

function execCmd() { 

    console.log('Testing command...'); 
    var bin = ChildProcess.exec('ls -l', { timeout: 5 }, function(error, stdout, stderr) { 
    console.log('executing...'); 
    console.log(error); 
    console.log(stdout); 
    console.log(stderr); 
    }); 

    bin.on('exit', function(code) { 
    console.log('Code: ' + code); 
    }); 
} 

module.exports = function() { 

    this.Given(/^I am on the command line$/, function(callback) { 
    execCmd(); 
    callback(); 
    }); 

} 

執行cucumber-js不會從執行的命令輸出任何內容。輸出如下;

Testing command... 
. 

1 scenario (1 passed) 
1 step (1 passed) 

但如果我只是函數定義之後調用execCmd(),去除module.exports塊和運行node cli.js我看到正確的輸出(即文件列表)。

我見過how to access stdout,stderr, and error in cucumber.js step definition using nodejs child_process exec,它沒有回答這個問題,只是陳述如何執行一個命令,沒有具體的在CucumberJS步驟中運行這個命令。

謝謝!

回答

2

我相信這個問題是由於幾件事情:

  1. 回調鑑於被調用時,基本上是在退出之前完成子進程執行cucumberjs程序。
  2. 退出委託傳入exec()正在分配'on'事件處理程序時被覆蓋。

我相信,這將解決您的問題:

var ChildProcess = require('child_process'); 

function execCmd(cb) { 

    console.log('Testing command...'); 
    var bin = ChildProcess.exec('ls -l', {timeout:5}, function(error, stdout, stderr) { 
    console.log('executing...'); 
    console.log(error); 
    console.log(stdout); 
    console.log(stderr); 
    cb(); 
    }); 
} 

module.exports = function() { 

    this.Given(/^I am on the command line$/, function(callback) { 
    execCmd(callback); 
    }); 

}