0

我正在尝试编写一些 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();
  });

}

Executingcucumber-js不会从已执行的命令中输出任何内容。输出如下;

Testing command...
.

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

但是,如果我只是execCmd()在函数定义之后调用,删除module.exports块并运行,node cli.js我会正确看到输出(即文件列表)。

我已经看到如何使用 nodejs child_process exec 访问 cucumber.js 步骤定义中的 stdout、stderr 和错误,它没有回答问题,只是说明了如何执行命令,而没有特定于在 CucumberJS 步骤中运行它的内容。

谢谢!

4

1 回答 1

2

我相信这个问题是由于几件事造成的:

  1. Given中调用回调,本质上是在完成子进程执行之前退出 cucumberjs 程序。
  2. 分配“on”事件处理程序时,传递给exec()的退出委托被覆盖。

我相信这会解决你的问题:

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);
  });

}
于 2014-02-20T15:22:31.640 回答