Php 测试需要输入的Symfony2控制台命令
我正在尝试使用phpunit测试Symfony2控制台命令 下面是Symfony2食谱中关于这个主题的文章: 然而,如果我没有提供输入(测试失败),那么phpunit就不会简单地坐在那里无所事事地等待输入。下面是一个例子: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
// 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来实现它。