Cucumber 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, я вижу результат (то есть список файлов) правильно.

Я видел как для доступа к stdout, stderr и ошибке в определении шага cucumber.js с помощью nodejs child_process exec, который не отвечает на вопрос и просто указывает, как выполнить команду, и ничего конкретного для ее выполнения на шаге CucumberJS.

Спасибо!


person tmcinerney    schedule 19.02.2014    source источник


Ответы (1)


Я считаю, что проблема связана с несколькими причинами:

  1. обратный вызов вызывается в Given, по сути, завершая программу 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);
  });

}
person Todd Anderson    schedule 20.02.2014