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.
Ausführen des Konsolenbefehls aus einem Symfony 2-Testfall
vinnylinux
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()
…
-
Dies ist die richtige Antwort, wie in der offiziellen Symfony2-Dokumentation unter “Testing Commands” erwähnt: symfony.com/doc/current/components/console/…
– Francesco Casula
3. Januar 2014 um 15:51 Uhr
-
@FrancescoCasula-Link ist defekt – neuer Standort: symfony.com/doc/current/console.html#testing-commands
– Jeff Puckett
16. Februar 2017 um 20:31 Uhr
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
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
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