Php 测试需要输入的Symfony2控制台命令

Php 测试需要输入的Symfony2控制台命令,php,symfony,console,console-application,Php,Symfony,Console,Console Application,我正在尝试使用phpunit测试Symfony2控制台命令 下面是Symfony2食谱中关于这个主题的文章: 然而,如果我没有提供输入(测试失败),那么phpunit就不会简单地坐在那里无所事事地等待输入。下面是一个例子: // MyCommand.php class MyCommand extends Command { // ... configure() protected function execute(InputInterface $input, OutputInterf

我正在尝试使用phpunit测试Symfony2控制台命令

下面是Symfony2食谱中关于这个主题的文章:

然而,如果我没有提供输入(测试失败),那么phpunit就不会简单地坐在那里无所事事地等待输入。下面是一个例子:

// MyCommand.php
class MyCommand extends Command {
  // ... configure()

  protected function execute(InputInterface $input, OutputInterface $output) {
     $qh = $this->getHelper('question');
     $q1 = new ConfirmationQuestion('First question, yes or no?', false);
     $qh->ask($input, $output, $q);
     $q2 = new ConfirmationQuestion('Second question, yes or no?', false);
     $qh->ask($input, $output, $q);
  }
}

// MyCommandTest.php
class MyCommandTest extends \PHPUnit_Framework_TestCase {
  // ... getInputstream()

  public function testExecute() {
    $app = new Application();
    $app->add(new MyCommand());

    $cmd = $app->find('askquestions');
    $cmdTester = new CommandTester($cmd);

    $helper = $cmd->getHelper('question');
    $helper->setInputStream($this->getInputStream('y\\n')); // this should be yy\\n

    $cmdTester->execute([
       'command' => $cmd->getName(),
    ]);
  }
}
请注意,我故意使我的测试不正确,它只是提供了问题1的答案。自从我写了那个测试之后,我已经添加了q2,但是我忘了修改我的测试。作为一名优秀的程序员,虽然我运行phpunit来查看是否有问题,但phpunit挂起,因为它期望从第2季度输入


如何使我的测试忽略任何进一步的输入请求,如果遇到输入请求则失败,并继续进行其他测试

一个可能的解决方案是反对Symfony2 Cookbook的文章建议使用setInputStream,而不是模拟问题助手,这样它实际上就不会要求输入。()这是可行的,但我想知道Symfony方法是什么。你有没有找到一种方法让它与setInputStream一起工作?我也面临同样的问题,它不能正常工作,而且相当笨重。你必须嘲笑QuestionHelper,正如我下面的回答所说,我编写了一个库来轻松、干净地完成这项工作。我最终通过选择一个精选问题而不是QuestionHelper来实现它。