Phpunit: Der Konstruktor in der Unterklasse von PHPUnit_Framework_TestCase führt dazu, dass @dataProvider bricht

Erstellt am 9. Aug. 2012  ·  4Kommentare  ·  Quelle: sebastianbergmann/phpunit

Wenn Sie einen Konstruktor in Ihrem Test haben, bricht die dataProvider-Anmerkung mit einem Fehler wegen fehlender Argumente ab:

PHPUnit 3.6.12 by Sebastian Bergmann.

...E

Time: 0 seconds, Memory: 3.25Mb

There was 1 error:

1) Test::testTheProvider
Missing argument 1 for Test::testTheProvider()

/home/nick/development/PHP-1.php:43

FAILURES!
Tests: 4, Assertions: 5, Errors: 1.

Das Entfernen des Konstruktors bewirkt, dass testTheProvider wieder funktioniert und @depends-Annotationen nicht zu beschädigen scheint.

<?php
class Test extends PHPUnit_Framework_TestCase {

    public function __construct() {
        parent::__construct();
    }

    public function testEmpty() {
        $stack = array();
        $this->assertEmpty($stack);

        return $stack;
    }

    /**
     * <strong i="10">@depends</strong> testEmpty
     */
    public function testPush(array $stack) {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertNotEmpty($stack);

        return $stack;
    }

    /**
     * <strong i="11">@depends</strong> testPush
     */
    public function testPop(array $stack) {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertEmpty($stack);
    }

    public function theProvider() {
        return array(
            array(true, false)
        );
    }

    /**
     * <strong i="12">@dataProvider</strong> theProvider
     */
    public function testTheProvider($var1, $var2) {
        //$var1 = true;
        //$var2 = false;

        $this->assertNotEquals($var1, $var2);
    }

}
?>

Hilfreichster Kommentar

Ich habe das Problem so gelöst:

Klassentest erweitert PHPUnit_Framework_TestCase {
öffentliche Funktion __construct($name = NULL, array $data = array(), $dataName = '') {
parent::__construct($name, $data, $dataName);
}
}

Alle 4 Kommentare

Erwartetes Verhalten. Wenn Sie PHPUnit_Framework_TestCase::__construct() überschreiben (was Sie nicht tun sollten), muss Ihre Implementierung alle Argumente der ursprünglichen Implementierung akzeptieren und an parent::__construct() weitergeben.

Danke für die Klarstellung. Der Konstruktor in PHPUnit_Framework_TestCase stellt jedoch Standardwerte für seine Argumente bereit und sie sind sowieso gleich definiert. Das Aufrufen sollte keinen Unterschied machen, es sei denn, Sie möchten ausdrücklich etwas ändern.

Darüber hinaus wird dies in den Dokumenten (http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.PHPUnit_Framework_TestCase) nicht erwähnt und das DBUnit BankAccount-Beispiel tut dies sogar (https:/ /github.com/sebastianbergmann/dbunit/blob/master/Samples/BankAccountDB/BankAccountDBTest.php#L60).

Ich würde nicht sagen, dass es ein erwartetes Verhalten war, wenn einige Anmerkungen funktionieren und andere nicht, nur weil dies der Fall ist.

Ich habe das Problem so gelöst:

Klassentest erweitert PHPUnit_Framework_TestCase {
öffentliche Funktion __construct($name = NULL, array $data = array(), $dataName = '') {
parent::__construct($name, $data, $dataName);
}
}

Hallo,
Ich hatte das Glück, diese Antwort zu finden, viel Zeit gespart. Ty, @foued611

Mein Fall ist so und es schlägt fehl.

# my base test class
use PHPUnit_Framework_TestCase;

class mytest extends PHPUnit_Framework_TestCase {
   public function __construct() {
     # do some common stuff to my tests...
  }
}


class IntegrationTest extends mytest {
  public function __construct() {
     parent::__construct();
  }
   /**
    * <strong i="9">@dataProvider</strong> additionProvider
    */
    public function testAdd($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
            'adding zeros'  => [0, 0, 0],
            'zero plus one' => [0, 1, 1],
            'one plus zero' => [1, 0, 1],
            'one plus one'  => [1, 1, 3]
        ];
    }

}

Feste und funktionierende Version sieht so aus

# my base test class
use PHPUnit_Framework_TestCase;

class mytest extends PHPUnit_Framework_TestCase {
   public function __construct() {
     # do some common stuff to my tests...
    parent::__construct(...func_get_args());
  }
}


class IntegrationTest extends mytest {
  public function __construct($name = NULL, array $data = array(), $dataName = '') {
    parent::__construct(...func_get_args());
  }
   /**
    * <strong i="13">@dataProvider</strong> additionProvider
    */
    public function testAdd($a, $b, $expected)
    {
        $this->assertEquals($expected, $a + $b);
    }

    public function additionProvider()
    {
        return [
            'adding zeros'  => [0, 0, 0],
            'zero plus one' => [0, 1, 1],
            'one plus zero' => [1, 0, 1],
            'one plus one'  => [1, 1, 3]
        ];
    }

}

Die aktuelle PHPUnit-Dokumentation warnt in keiner Weise davor, benutzerdefinierte __constructor() für Ihre Testklassen hinzuzufügen, die dataProvider verwenden. Diese Informationen könnten in die aktuelle Data Providers-Dokumentation aufgenommen werden, zumindest würden sie Ihnen einen Hinweis geben, warum Ihre Implementierung nicht funktioniert, selbst wenn Sie den DataProvider-Beispielcode kopieren und einfügen.
Und wenn Sie einen benutzerdefinierten __constructor verwenden müssen, fügen Sie eine Anleitung hinzu, wie er erstellt werden kann, damit er funktioniert.

Ping wegen geschlossen @sebastianbergmann

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen