Symfony 2 テスト ケースからコンソール コマンドを実行する方法はありますか? スキーマを作成および削除するための doctrine コマンドを実行したいと考えています。
4 に答える
このドキュメントの章では、さまざまな場所からコマンドを実行する方法について説明します。あなたのニーズに使用exec()
することは非常に汚い解決策であることに注意してください...
Symfony2 でコンソール コマンドを実行する正しい方法は次のとおりです。
オプション 1
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()));
}
}
オプション 2
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 Guys、呼び出しで 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 [...]");
ドキュメントは、私の最後の回答以降、既存のコマンドを呼び出す適切な Symfony 2 の方法を反映するように更新されました。
http://symfony.com/doc/current/components/console/introduction.html#calling-an-existing-command