Ausführen des Konsolenbefehls aus einem Symfony 2-Testfall

Lesezeit: 3 Minuten

Benutzeravatar von vinnylinux
vinnylinux

Gibt es eine Möglichkeit, einen Konsolenbefehl aus einem Symfony 2-Testfall auszuführen? Ich möchte die Doktrinbefehle zum Erstellen und Löschen von Schemas ausführen.

Benutzeravatar von Vitalii Zurian
Vitalii Zurian

Dies Kapitel Dokumentation erklärt, wie Befehle von verschiedenen Orten ausgeführt werden. Beachten Sie, dass mit exec() für Ihre Bedürfnisse ist eine ziemlich schmutzige Lösung …

Das richtiger Weg zum Ausführen des Konsolenbefehls in Symfony2 ist wie folgt:

Option eins

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

Möglichkeit zwei

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 Leute, beschämt Symfony2 nicht mit dem Anruf exec()

Das Dokumente sagen Ihnen die vorgeschlagene Vorgehensweise. Der Beispielcode wird unten eingefügt:

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

    // ...
}

  • Dies dient zum Ausführen eines Befehls von einem anderen Befehl, nicht von einem Testfall.

    – Machiel

    24. Juni 2013 um 23:32 Uhr

Benutzeravatar von ContextSwitch
ContextSwitch

Ja, wenn Ihre Verzeichnisstruktur so aussieht

/symfony
    /app
    /src

dann würdest du laufen

phpunit -c app/phpunit.xml.dist

Von Ihren Unit-Tests aus können Sie PHP-Befehle entweder mit ausführen

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)

oder indem Sie den Befehl in Back-Ticks setzen

php app/consode [...]

Wenn Sie die Komponententests aus einem anderen Verzeichnis als symofny ausführen, müssen Sie den relativen Pfad zum App-Verzeichnis anpassen, damit es funktioniert.

So führen Sie es über die App aus:

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

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

  • Gibt es keine Möglichkeit, innerhalb der Anwendung zu laufen? Ich versuche, vollständig isolierte Tests zu erstellen.

    – Winnylinux

    30. April 2012 um 17:58 Uhr

  • Außerdem möchte ich, dass der Befehl in einer bestimmten Umgebung ausgeführt wird (Test).

    – Winnylinux

    30. April 2012 um 18:11 Uhr

  • Ja, Sie könnten diesen Code in ein Modell oder eine Entität einfügen, aber Sie müssten verwenden $_SERVER['DOCUMENT_ROOT']; um den Pfad zur App zu erhalten. Ich werde meine Antwort bearbeiten

    – Kontextwechsel

    30. April 2012 um 19:48 Uhr


  • Ich bin mir nicht sicher, wie ich von der App aus auf die Umgebung zugreifen soll, aber wenn es eine Möglichkeit gibt, fügen Sie die Pass-Thru einfach in eine if-Anweisung ein, die nach der Umgebung sucht

    – Kontextwechsel

    30. April 2012 um 19:52 Uhr

  • exec() funktioniert nicht, da es sich nicht im Testcontainer befindet.

    – Jake Sylvestre

    3. April 2017 um 0:04 Uhr

Benutzeravatar von Klaus S
Klaus S.

Die Dokumentation wurde seit meiner letzten Antwort aktualisiert, um die richtige Symfony 2-Methode zum Aufrufen eines vorhandenen Befehls widerzuspiegeln:

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

1434000cookie-checkAusführen des Konsolenbefehls aus einem Symfony 2-Testfall

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy