Есть ли способ запустить консольную команду из тестового примера 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 [...]");