Выполнение команды консоли из тестового примера Symfony 2

Есть ли способ запустить консольную команду из тестового примера Symfony 2? Я хочу запустить команды doctrine для создания и удаления схем.

Документация была обновлена ​​с момента моего последнего ответа, чтобы отразить правильный способ Symfony 2 вызова существующей команды:

http://symfony.com/doc/current/components/console/introduction.html#calling-an-existing-command

В этой главе документации описывается, как выполнять команды из разных мест. Разумеется, использование exec() для ваших нужд – довольно грязное решение …

Правильный способ выполнения консольной команды в Symfony2 выглядит так:

Вариант один

 use Symfony\Bundle\FrameworkBundle\Console\Application as App; use Symfony\Component\Console\Tester\CommandTester; class YourTest extends WebTestCase { public function setUp() { $kernel = $this->createKernel(); $kernel->boot(); $application = new App($kernel); $application->add(new YourCommand()); $command = $application->find('your:command:name'); $commandTester = new CommandTester($command); $commandTester->execute(array('command' => $command->getName())); } } 

Второй вариант

 use Symfony\Component\Console\Input\StringInput; use Symfony\Bundle\FrameworkBundle\Console\Application; class YourClass extends WebTestCase { protected static $application; public function setUp() { self::runCommand('your:command:name'); // you can also specify an environment: // self::runCommand('your:command:name --env=test'); } protected static function runCommand($command) { $command = sprintf('%s --quiet', $command); return self::getApplication()->run(new StringInput($command)); } protected static function getApplication() { if (null === self::$application) { $client = static::createClient(); self::$application = new Application($client->getKernel()); self::$application->setAutoExit(false); } return self::$application; } } 

PS Ребята, не стыдитесь Symfony2 с вызовом exec()

Документы сообщают вам о предлагаемом способе сделать это. Примерный код будет вставлен ниже:

 protected function execute(InputInterface $input, OutputInterface $output) { $command = $this->getApplication()->find('demo:greet'); $arguments = array( 'command' => 'demo:greet', 'name' => 'Fabien', '--yell' => true, ); $input = new ArrayInput($arguments); $returnCode = $command->run($input, $output); // ... } 

Да, если ваша структура каталогов выглядит

 /symfony /app /src 

то вы будете запускать

phpunit -c app/phpunit.xml.dist

из ваших модульных тестов вы можете запускать команды php либо с помощью

 passthru("php app/console [...]") (http://php.net/manual/en/function.passthru.php) exec("php app/console [...]") (http://www.php.net/manual/en/function.exec.php) 

или поместив команду в обратные тики

php app/consode [...]

Если вы запускаете модульные тесты из каталога, отличного от symofny, вам придется настроить относительный путь к каталогу приложений, чтобы он работал.

Чтобы запустить его из приложения:

 // the document root should be the web folder $root = $_SERVER['DOCUMENT_ROOT']; passthru("php $root/../app/console [...]");