Phpunit: Konstruktor di subkelas PHPUnit_Framework_TestCase menyebabkan @dataProvider rusak

Dibuat pada 9 Agu 2012  ·  4Komentar  ·  Sumber: sebastianbergmann/phpunit

Memiliki konstruktor dalam pengujian Anda menyebabkan anotasi dataProvider rusak dengan kesalahan tentang argumen yang hilang:

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.

Menghapus konstruktor menyebabkan testTheProvider berfungsi lagi, dan tampaknya tidak merusak anotasi @depends .

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

}
?>

Komentar yang paling membantu

Saya telah memecahkan masalah seperti ini:

class Test memperluas PHPUnit_Framework_TestCase {
fungsi publik __construct($name = NULL, array $data = array(), $dataName = '') {
induk::__construct($nama, $data, $dataName);
}
}

Semua 4 komentar

Perilaku yang diharapkan. Jika Anda mengganti PHPUnit_Framework_TestCase::__construct() (yang seharusnya tidak Anda lakukan) implementasi Anda harus menerima semua argumen dari implementasi asli dan meneruskannya ke parent::__construct() .

Terimakasih atas klarifikasinya. Namun, konstruktor di PHPUnit_Framework_TestCase memberikan nilai default untuk argumennya dan mereka tetap didefinisikan sama. Menyebutnya seharusnya tidak ada bedanya kecuali Anda secara khusus ingin mengubah sesuatu.

Selain itu, ini tidak disebutkan dalam dokumen (http://www.phpunit.de/manual/current/en/extending-phpunit.html#extending-phpunit.PHPUnit_Framework_TestCase) dan sampel DBUnit BankAccount bahkan melakukan ini (https:/ /github.com/sebastibergmann/dbunit/blob/master/Samples/BankAccountDB/BankAccountDBTest.php#L60).

Saya tidak akan mengatakan itu adalah perilaku yang diharapkan jika beberapa anotasi berfungsi dan beberapa tidak hanya karena ini.

Saya telah memecahkan masalah seperti ini:

class Test memperluas PHPUnit_Framework_TestCase {
fungsi publik __construct($name = NULL, array $data = array(), $dataName = '') {
induk::__construct($nama, $data, $dataName);
}
}

Hai,
Saya beruntung menemukan jawaban ini, menghemat banyak waktu. Ty, @foued611

Kasus saya seperti ini dan gagal.

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

}

versi tetap dan berfungsi terlihat seperti ini

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

}

Dokumentasi PHPUnit saat ini tidak memperingatkan dengan cara apa pun yang tidak menambahkan __constructor() khusus untuk kelas pengujian Anda yang menggunakan dataProvider. Informasi tersebut dapat ditambahkan ke dokumentasi Penyedia Data saat ini, setidaknya itu akan memberi Anda petunjuk mengapa implementasi Anda tidak berfungsi bahkan jika Anda menyalin-menempelkan contoh kode dataProvider.
Dan jika Anda perlu menggunakan __constructor khusus, tambahkan beberapa panduan cara membuatnya agar berfungsi.

Ping karena ditutup @sebastibergmann

Apakah halaman ini membantu?
0 / 5 - 0 peringkat