Phpunit: Datenprovider-Argumentanzahlfehler

Erstellt am 19. Dez. 2016  ·  4Kommentare  ·  Quelle: sebastianbergmann/phpunit

Ich verwende die neueste Version von PHPUnit (5.7.4). Das Problem ist, wenn ich den Test durchführe, besteht er. Aber wenn ich es noch einmal ausführe, schlägt es mit folgendem Fehler fehl:

ArgumentCountError: Too few arguments to function ValidationTest::testValidateType(), 0 passed and at least 3 expected

Wenn ich Änderungen an der Datenproviderfunktion vornehme (dh die zurückzugebenden Daten, Name oder Typ der Providerfunktion usw. ändere) und erneut starte, wird sie einmal erfolgreich ausgeführt und schlägt bei allen nachfolgenden Testläufen mit dem obigen Fehler fehl.

Nicht sicher, aber verwendet PHPUnit einen Caching-Mechanismus, um Anbieterdaten zwischenzuspeichern? Wenn ja, gibt es eine Möglichkeit, es zu reinigen (vielleicht mit setUp oder tearDown )?


Der folgende Code funktioniert einmal (einmal übergeben):

/**
 * <strong i="15">@covers</strong> Validation
 * <strong i="16">@coversDefaultClass</strong> Validation
 */
class ValidationTest extends TestCase {

    protected $validation;


    protected function setUp() {
        $this->validation = new Validation();
    }


    /**
     * <strong i="17">@covers</strong> ::validateType
     * <strong i="18">@dataProvider</strong> validateTypeProdiver
     */
    public function testValidateType($assertion, $argument, $type) {
        $result = $this->validation->validateType($argument, $type);

        switch ($assertion) {
            case 'True':
                $this->assertTrue($result);
                break;
        }
    }


    public function validateTypeProdiver() {
        return [
            ['True', 'file.txt', 'str']
       ];
    }
}

Der folgende Code funktioniert immer (passiert jedes Mal):

/**
 * <strong i="24">@covers</strong> Validation
 * <strong i="25">@coversDefaultClass</strong> Validation
 */
class ValidationTest extends TestCase {

    protected $validation;


    protected function setUp() {
        $this->validation = new Validation();
    }


    /**
     * <strong i="26">@covers</strong> ::validateType
     */
    public function testValidateType() {
        foreach ($this->validateTypeProdiver() as $args) {
            $result = call_user_func_array([$this->validation, 'validateType'], array_slice($args, 1));

            switch ($args[0]) {
                case 'True':
                    $this->assertTrue($result);
                    break;
            }
        }
    }


    public function validateTypeProdiver() {
        return [
            ['True', 'file.txt', 'str']
       ];
    }
}

Hilfreichster Kommentar

Wenn jemand irgendwann auf dieses Problem gestoßen ist.
Ich hatte diesen Test

class Test extends TestCase {
    protected $tested;

    public function __construct()
    {
        parent::__construct();
        $this->tested = new TestedClass();
    }

    public function provider(): array
    {
        return array(
            array(0, 1, 1),
            array(1, 2, 3),
        );
    }

    /**
     * <strong i="7">@dataProvider</strong> provider
     */
    public function testSum(int $first, int $second, int $expected)
    {
        $this->assertEquals($expected, $this->tested->sum($first + $second));
    }
}

Ich habe __construct in setUp geändert und es funktioniert.

Alle 4 Kommentare

Ich kann das Problem mit Ihren Angaben nicht reproduzieren. Folgendes habe ich getan:

$ composer require phpunit/phpunit:5.7.4
$ vendor/bin/phpunit && vendor/bin/phpunit

$ vendor/bin/phpunit && vendor/bin/phpunit 
PHPUnit 5.7.4 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.17-2+deb.sury.org~trusty+1
Configuration: /.../phpunit.xml

.                                                                   1 / 1 (100%)

Time: 44 ms, Memory: 4.00MB

OK (1 test, 1 assertion)
PHPUnit 5.7.4 by Sebastian Bergmann and contributors.

Runtime:       PHP 7.0.17-2+deb.sury.org~trusty+1
Configuration: /.../phpunit.xml

.                                                                   1 / 1 (100%)

Time: 32 ms, Memory: 4.00MB

OK (1 test, 1 assertion)

Dies ist die Testklasse, die ich verwendet habe:

use PHPUnit\Framework\TestCase;

class TestMeTest extends TestCase
{

    protected $validation;

    protected function setUp()
    {

        $this->validation = new Validation();
    }

    /**
     * <strong i="9">@covers</strong> ::validateType
     * <strong i="10">@dataProvider</strong> validateTypeProdiver
     */
    public function testValidateType($assertion, $argument, $type)
    {

        $result = $this->validation->validateType($argument, $type);

        switch ($assertion) {
            case 'True':
                $this->assertTrue($result);
                break;
        }
    }

    public function validateTypeProdiver()
    {

        return [
            ['True', 'file.txt', 'str']
        ];
    }
}

Und die Klasse Validation :

class Validation
{
    public function validateType() {
        return true;
    }
}

PHPUnit speichert Datenprovider nicht dauerhaft zwischen.

Auch das kann ich nicht reproduzieren.

Wenn jemand irgendwann auf dieses Problem gestoßen ist.
Ich hatte diesen Test

class Test extends TestCase {
    protected $tested;

    public function __construct()
    {
        parent::__construct();
        $this->tested = new TestedClass();
    }

    public function provider(): array
    {
        return array(
            array(0, 1, 1),
            array(1, 2, 3),
        );
    }

    /**
     * <strong i="7">@dataProvider</strong> provider
     */
    public function testSum(int $first, int $second, int $expected)
    {
        $this->assertEquals($expected, $this->tested->sum($first + $second));
    }
}

Ich habe __construct in setUp geändert und es funktioniert.

Die Lösung von @dmirogin hat meinen Tag gemacht, phpunit 8.5

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen