通过symfony单元测试中的shell_exec/ApplicationTester等获取symfony命令的输出

通过symfony单元测试中的shell_exec/ApplicationTester等获取symfony命令的输出,symfony,command,phpunit,shell-exec,Symfony,Command,Phpunit,Shell Exec,我想在独立于单元测试的进程中运行一个命令,并获取其输出。我已经测试了几个选项,比如使用shell\u exec或ApplicationTester-类。虽然命令显然是执行的(我通过插入一些副作用进行了检查),但从单元测试执行时无法获得其输出 但是,如果我创建了一个小的独立php文件(见下文,runDummyCmd.php),其中包含一个相应的shell\u exec,我将获得symfony命令的输出 如何复制 虚拟命令: <?php namespace App\Command; us

我想在独立于单元测试的进程中运行一个命令,并获取其输出。我已经测试了几个选项,比如使用
shell\u exec
ApplicationTester
-类。虽然命令显然是执行的(我通过插入一些副作用进行了检查),但从单元测试执行时无法获得其输出

但是,如果我创建了一个小的独立php文件(见下文,
runDummyCmd.php
),其中包含一个相应的
shell\u exec
,我将获得symfony命令的输出

如何复制

虚拟命令:

<?php


namespace App\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DummyCommand extends Command
{
    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this
            ->setName('app:dummycmd')
            ->setDescription('Can be used for testing commands')
            ->setHelp('Does a simple output.');
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->writeln('Test!');
        return 0;
    }
}
runDummyCmd.php:

<?php
$cmd = 'env APP_ENV=test bin/console app:dummycmd';

var_dump($cmd);
$output = shell_exec($cmd);

var_dump($output);
?>
控制台上执行
runDummyCmd.php
的输出:

string(41) "env APP_ENV=test bin/console app:dummycmd"
string(6) "Test!
"

你试过CommandTester类吗

$command = $application->find('app:dummycmd');
$commandTester = new CommandTester($command);
$commandTester->execute([
   'command'  => $command->getName()
]);
$output = $commandTester->getDisplay();

你试过CommandTester类吗

$command = $application->find('app:dummycmd');
$commandTester = new CommandTester($command);
$commandTester->execute([
   'command'  => $command->getName()
]);
$output = $commandTester->getDisplay();

但是,如果我拼错了命令,因此
bin/console
产生错误,相应的错误消息将传递到输出。我将您的命令和测试转储到一个新的symfony项目中,它立即工作。将stderr重定向到stdout(
$cmd='env-APP_-env=test'.$this->projectDir./bin/console-APP:dummycmd 2>&1';
)时会得到什么输出?感谢您的测试!我尝试重定向stderr,但它也不起作用,结果仍然为null。奇怪。执行的退出代码也会很有趣。由于您使用的是symfony,因此可以使用。这为您提供了访问stdout、stderr和退出代码的方便方法。很抱歉,响应太晚:我使用exec()执行了命令,并获得了输出和退出代码,即0。正如我在最初的问题中所写的,由于其副作用,可以注意到命令的执行。这很奇怪……但是,如果我拼错了命令,因此
bin/console
产生错误,相应的错误消息将传递到输出。我将您的命令和测试转储到一个新的symfony项目中,它立即工作。将stderr重定向到stdout(
$cmd='env-APP_-env=test'.$this->projectDir./bin/console-APP:dummycmd 2>&1';
)时会得到什么输出?感谢您的测试!我尝试重定向stderr,但它也不起作用,结果仍然为null。奇怪。执行的退出代码也会很有趣。由于您使用的是symfony,因此可以使用。这为您提供了访问stdout、stderr和退出代码的方便方法。很抱歉,响应太晚:我使用exec()执行了命令,并获得了输出和退出代码,即0。正如我在最初的问题中所写的,由于其副作用,可以注意到命令的执行。这是非常奇怪的…是的,我以前用过,但它没有产生一个对我来说很重要的子进程。是的,我以前用过,但它没有产生一个对我来说很重要的子进程。
$command = $application->find('app:dummycmd');
$commandTester = new CommandTester($command);
$commandTester->execute([
   'command'  => $command->getName()
]);
$output = $commandTester->getDisplay();