2016-06-06 14 views
3

Ich habe einen Symfony-Befehl erstellt, um meine Anwendung in den Ausgangszustand zurückzusetzen. Um diesen Befehl aus dem cli laufen muss ich eingeben:Befehl vor allen Tests ausführen

php bin/console app:reset 

Ich möchte diesen Befehl auszuführen einmal vor allen Unit-Tests. Ich könnte das tun vor jedem Test und sicherlich vor alle Klassen. Deshalb habe ich diesen Code:

public function setUp() 
{ 
    $kernel = new \AppKernel('test', true); 
    $kernel->boot(); 
    $app = new \Symfony\Bundle\FrameworkBundle\Console\Application($kernel); 
    $app->setAutoExit(false); 

    $app->run(new ArrayInput([ 
     'command' => 'app:reset', ['-q'] 
    ]), new NullOutput()); 
} 

Wie oben erwähnt, dass vor jedem Test Arbeits schön und mit setUpBeforeClass() könnte ich, dass vor jeder Klasse hat, aber einmal, bevor alle Tests ausreichend wären, da dieser Befehl einige Zeit dauern, zu rennen.

Antwort

2

Sie könnten a test listener implementieren und eine statische Eigenschaft verwenden, um sicherzustellen, dass Ihr Befehl nur einmal ausgeführt wird.

Beispiel für PHPUnit 5.4:

<?php 

use PHPUnit\Framework\TestCase; 

class AppResetTestListener extends PHPUnit_Framework_BaseTestListener 
{ 
    static $wasCalled = false; 

    public function startTestSuite(PHPUnit_Framework_TestSuite $suite) 
    { 
     if (!self::$wasCalled) { 
      // @todo call your command 

      self::$wasCalled = true; 
     } 
    } 
} 

Sie werden in Ihrem phpunit.xml config enable the test listener müssen.

Lesen Sie mehr:

+0

Gute Idee, gonna check it out! – philipp

+0

Nach einigen Experimenten habe ich herausgefunden, dass Sie auch eine reguläre Membervariable verwenden können. Auf diese Weise können Sie eine Basisklasse erstellen, von der mehrere untergeordnete Child-Listener erben können. Ebenso kann jeder Listener sich selbst als Shutdown-Funktion registrieren (tun Sie dies von der Basisklasse aus), um eine "endTestSuite" -Funktionalität bereitzustellen. – TaZ

Verwandte Themen