2012-04-30 4 views

答えて

-3

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

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

+0

感謝のように働いた、ありがとう。 – vinnylinux

+12

これは真実ではありませんsymfony way –

+6

ouptutを正しく解析できないので、それは良い方法ではありません。また、環境に問題が発生する可能性があります(phpがテストを実行しているユーザーのパスにない場合はどうなりますか?)。 – Sgoettschkes

-1

ディレクトリ構造が

/symfony 
    /app 
    /src 

のように見える場合は、[はい、あなたはあなたが

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のコマンドを実行することができ、あなたのユニットテストから

phpunit -c app/phpunit.xml.dist

を実行します

を入力するか、またはコマンドをバックティックに置くことによって

php app/consode [...]

あなたはsymofny以外のディレクトリからのユニットテストを実行している場合、あなたはそれを動作させるためのアプリケーションディレクトリへの相対パスを調整する必要があります。

// the document root should be the web folder 
$root = $_SERVER['DOCUMENT_ROOT']; 

passthru("php $root/../app/console [...]"); 
+1

アプリケーション内部から実行する方法はありませんか?私は完全に分離したテストを作成しようとしています。 – vinnylinux

+0

また、特定の環境(テスト)でコマンドを実行したい。 – vinnylinux

+0

はい、そのコードをモデルやエンティティに入れることができますが、appへのパスを取得するには '$ _SERVER ['DOCUMENT_ROOT'];'を使用する必要があります。私の答えを編集します – ContextSwitch

68

このアプリからそれを実行する

documentation chapterは、異なる場所からコマンドを実行する方法を説明しています。

オプション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())); 
    } 
} 

:あなたのニーズに合わせてexec()を使用すると、非常に汚いソリューションです... Symfony2の中にコンソールコマンドを実行する

正しい方法は以下の通りであることに留意し、オプション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; 
    } 
} 

P.S.みんな、symfony2に電話して恥ずかしくないよ。exec() ...

+1

これは、公式のSymfony2ドキュメントの「テストコマンド」で述べた正しい答えです。http://symfony.com/doc/current/components/console/introduction.html#testing-commands –

+1

また、質問はコマンドのテストについて... – Moonchild

+0

@FrancescoCasulaのリンクが壊れています - 新しい場所:http://symfony.com/doc/current/console.html#testing-commands –

5

docsはあなたにそれをする方法を教えてくれます。以下のサンプルコードは貼り付けられています。

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

    // ... 
} 
+0

私は既にその章を参考にしています: –

+0

ああ、それに気付かなかった。 – Squazic

+5

これは、テストケースからではなく、別のコマンドからコマンドを実行するためのものです。 – Machiel

関連する問題