Saat Anda berada di sini, Anda mungkin sangat menyadari bahwa PHPUnit 8+ memerlukan metode templat umum seperti setUp()
atau tearDown()
untuk memiliki deklarasi tipe pengembalian void
, yang mana metode tersebut secara alami merusak apa pun di bawah PHP 7.1.
Meskipun bukan masalah besar untuk memperbarui kode Anda secara otomatis untuk menggunakan deklarasi tipe pengembalian ini dengan bantuan seperti PHP-CS-Fixer atau Rector, ini mungkin menjadi masalah jika, karena alasan apa pun yang tidak menguntungkan (tetapi semoga menguntungkan) , Anda harus memastikan kode Anda berfungsi di bawah PHP 7.0 atau PHP 5.6, sementara keinginan untuk menggunakan dunia terbaik dapat memberi Anda versi PHPUnit yang lebih baru.
Dalam hal ini, Anda akan menghadapi dua masalah. Pertama, versi PHPUnit yang lebih baru tidak memiliki pernyataan lama, tetapi Anda dapat menemukan jalan keluarnya, dan yang lain, seperti yang disebutkan, versi PHPUnit yang lebih baru memerlukan deklarasi tipe pengembalian void
untuk metode templat yang mudah digunakan, dan kemudian Anda terjebak karena menulis ulang tes untuk bekerja tanpa metode templat ini sangat menyusahkan dan bahkan mungkin mustahil. Dan kemudian perpustakaan kecil ini hadir untuk menyelamatkan hari Anda!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
Pertama, perbarui pengujian Anda untuk diperluas dari LegacyPHPUnitTestCase
alih-alih PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
Kemudian, jika Anda harus menggunakan metode setUp(): void
template, gunakan metode doSetUp()
, hilangkan semua tipe pengembalian apa pun dengan cara yang sepenuhnya kompatibel dengan versi sebelumnya.
- protected function setUp(): void
+ protected function doSetUp()
Ada pengganti serupa untuk sebagian besar metode templat lainnya:
- public static function setUpBeforeClass(): void
+ public static function doSetUpBeforeClass()
- public static function tearDownAfterClass(): void
+ public static function doTearDownAfterClass()
- protected function setUp(): void
+ protected function doSetUp()
- protected function tearDown(): void
+ protected function doTearDown()
- protected function assertPreConditions(): void
+ protected function doAssertPreConditions()
- protected function assertPostConditions(): void
+ protected function doAssertPostConditions()
Metode | Penggantian |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
Versi mendatang kemungkinan besar akan mengikuti pola yang sama.
Meskipun perpustakaan ini memecahkan bagian masalah yang paling menjengkelkan, ada bagian lain yang tidak dirancang untuk dicakup oleh perpustakaan. Misalnya:
assertContains
digunakan dengan string, sedangkan versi lainnya tidak.expectExceptionMessageRegExp
, sedangkan di versi lain metode yang sama expectExceptionMessageMatches
.Ada polyfill untuk metode yang diubah ini (lihat di bawah), tetapi menulis polyfill ad hoc hanya untuk metode yang Anda perlukan bukanlah masalah besar. Misalnya:
public function __call ( $ method , $ args )
{
if ( $ method === ' assertStringContainsString ' ) {
$ this -> assertContains (... $ args );
}
if ( $ method === ' assertIsBool ' ) {
$ this -> assertTrue ( is_bool ( $ args [ 0 ]));
}
if ( $ method === ' expectExceptionMessageRegExp ' ) {
$ this -> expectExceptionMessageMatches (... $ args );
}
throw new InvalidArgumentException ();
}
Jika ada beberapa polyfill multi-versi modular (dan bukan) untuk ini, dan metode lainnya:
yoast/phpunit-polyfills
.phpunitgoodpractices/polyfill
.