Phpunit: Kesalahan Hitungan Argumen Penyedia Data

Dibuat pada 19 Des 2016  ·  4Komentar  ·  Sumber: sebastianbergmann/phpunit

Saya menggunakan versi terbaru PHPUnit (5.7.4). Masalahnya adalah ketika saya menjalankan tes, itu lulus. Tetapi jika saya menjalankannya sekali lagi, itu gagal dengan kesalahan berikut:

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

Jika saya membuat perubahan apa pun pada fungsi penyedia data (yaitu mengubah data yang akan dikembalikan, nama atau jenis fungsi penyedia, dll.) dan menjalankan kembali, itu lolos sekali dan gagal dengan kesalahan di atas untuk semua pengujian berturut-turut.

Tidak yakin, tetapi apakah PHPUnit menggunakan mekanisme caching apa pun untuk men-cache data penyedia? Jika ya, apakah ada cara untuk membersihkannya (mungkin menggunakan setUp atau tearDown )?


Kode berikut berfungsi sekali (lulus sekali):

/**
 * <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']
       ];
    }
}

Kode berikut selalu berfungsi (berlalu setiap saat):

/**
 * <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']
       ];
    }
}

Komentar yang paling membantu

Jika seseorang kadang-kadang mengalami masalah ini.
Saya memiliki tes ini

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));
    }
}

Saya mengubah __construct menjadi setUp dan berfungsi.

Semua 4 komentar

Saya tidak dapat mereproduksi masalah dengan informasi yang Anda berikan. Inilah yang saya lakukan:

$ 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)

Ini adalah kelas tes yang saya gunakan:

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']
        ];
    }
}

Dan kelas Validation :

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

PHPUnit tidak menyimpan penyedia data secara terus-menerus.

Saya juga tidak dapat mereproduksi ini.

Jika seseorang kadang-kadang mengalami masalah ini.
Saya memiliki tes ini

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));
    }
}

Saya mengubah __construct menjadi setUp dan berfungsi.

Solusi @dmirogin membuat hari saya menyenangkan, phpunit 8.5

Apakah halaman ini membantu?
0 / 5 - 0 peringkat