PHPUnit @Depends Variablen im @Dataprovider verwenden


Leider ist es zur Zeit nicht möglich für einen PHPUnit Test sowohl einen anderen Test als Vorraussetzung für einen Test zu markieren, damit die Ausführung des Tests im Fehlerfall nicht stattfindet, und gleichzeitig einen Dataprovider für den Test zu verwenden der auf das Ergebnis einen vorherigen Tests zugreift. Das liegt daran, dass Dataprovider vor dem Durchlaufen der Tests initilisiert werden von PHPunit.

Das Problem

class StackTest extends PHPUnit_Framework_TestCase {
    protected static $foo;

    public function provider() { 
        print_r( self::$foo); //does not work
    }

    /**
     * @dataProvider provider
     */
    public function testOne() {
        self::$foo = array();
    }

    /**
     * @depends testOne
     * @dataProvider provider
     */
    public function testTwo( $data ) { 
    }

Die Lösung

Das Problem lässt sich umgehen in der aktuellen Version von PHPUnit 5.2+, indem man im eigentlich Test auf die statische Varaible zugreift, was unschön ist, aber die einzige Möglichkeit ist:

class StackTest extends PHPUnit_Framework_TestCase {
    protected static $foo;

    public function provider() { 
      
    }

    /**
     * @dataProvider provider
     */
    public function testOne() {
        self::$foo = array();
    }

    /**
     * @depends testOne
     * @dataProvider provider
     */
    public function testTwo( $data ) { 
        $data->foo = self::$foo;

    }