24

Symfony 2 テスト ケースからコンソール コマンドを実行する方法はありますか? スキーマを作成および削除するための doctrine コマンドを実行したいと考えています。

4

4 に答える 4

75

このドキュメントの章では、さまざまな場所からコマンドを実行する方法について説明します。あなたのニーズに使用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()...

于 2012-08-01T08:42:45.627 に答える
5

ドキュメントは、それを行うための推奨される方法を教えてくれます。サンプル コードを以下に貼り付けます。

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);

    // ...
}
于 2012-10-01T23:33:36.877 に答える
-1

はい、ディレクトリ構造が次のようになっている場合

/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 [...]");
于 2012-04-30T17:40:28.927 に答える
-2

ドキュメントは、私の最後の回答以降、既存のコマンドを呼び出す適切な Symfony 2 の方法を反映するように更新されました。

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

于 2012-05-01T16:06:55.307 に答える