เมื่อคุณอยู่ที่นี่ คุณอาจทราบดีว่า PHPUnit 8+ ต้องใช้วิธีเทมเพลตทั่วไป เช่น setUp()
หรือ tearDown()
เพื่อให้มีการประกาศประเภทการส่งคืน void
ซึ่งวิธีการดังกล่าวจะทำลายสิ่งใดก็ตามที่ต่ำกว่า PHP 7.1 โดยธรรมชาติ
แม้ว่าจะไม่ใช่เรื่องใหญ่ที่จะต้องอัปเดตโค้ดของคุณโดยอัตโนมัติเพื่อใช้การประกาศประเภทการส่งคืนเหล่านี้ด้วยความช่วยเหลือจาก PHP-CS-Fixer หรือ Rector แต่ก็อาจกลายเป็นปัญหาได้หากด้วยเหตุผลใดก็ตามที่โชคร้าย (แต่หวังว่าจะได้กำไร) คุณต้องแน่ใจว่าโค้ดของคุณทำงานภายใต้ PHP 7.0 หรือ PHP 5.6 ในขณะที่ต้องการใช้โลกที่ดีที่สุดก็สามารถให้ PHPUnit เวอร์ชันล่าสุดที่น้อยลงได้
ในกรณีนี้ คุณจะมีปัญหาสองประการ หนึ่ง PHPUnit เวอร์ชันใหม่กว่าไม่มีการยืนยันแบบเก่า แต่คุณสามารถหาวิธีแก้ไขได้ และอีกเวอร์ชันหนึ่งตามที่กล่าวไว้ PHPUnit เวอร์ชันใหม่กว่าจำเป็นต้องมีการประกาศประเภทการส่งคืน void
สำหรับวิธีเทมเพลตที่สะดวก จากนั้นคุณติดอยู่เนื่องจากการเขียนใหม่ การทดสอบการทำงานโดยไม่ใช้วิธีเทมเพลตเหล่านี้ถือเป็นปัญหาใหญ่และอาจเป็นไปไม่ได้ด้วยซ้ำ แล้วห้องสมุดเล็กๆ แห่งนี้ก็มาช่วยคุณ!
composer require --dev sanmai/phpunit-legacy-adapter:"^6.4 || ^8.2.1"
ขั้นแรก อัปเดตการทดสอบของคุณเพื่อขยายจาก LegacyPHPUnitTestCase
แทน PHPUnitFrameworkTestCase
:
- class MyTest extends PHPUnitFrameworkTestCase
+ class MyTest extends LegacyPHPUnitTestCase
จากนั้นที่คุณต้องใช้ setUp(): void
template method ให้ใช้ doSetUp()
method โดยละเว้นประเภทการส่งคืนใด ๆ ทั้งหมดในวิธีที่เข้ากันได้แบบย้อนหลังโดยสมบูรณ์
- protected function setUp(): void
+ protected function doSetUp()
มีการแทนที่ที่คล้ายกันสำหรับวิธีเทมเพลตอื่นๆ ส่วนใหญ่:
- 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()
วิธี | การทดแทน |
---|---|
setUpBeforeClass(): void | doSetUpBeforeClass() |
tearDownAfterClass(): void | doTearDownAfterClass() |
setUp(): void | doSetUp() |
tearDown(): void | doTearDown() |
assertPreConditions(): void | doAssertPreConditions() |
assertPostConditions(): void | doAssertPostConditions() |
เวอร์ชันต่อๆ ไปก็คงจะมีรูปแบบเดียวกัน
แม้ว่าห้องสมุดนี้จะแก้ปัญหาส่วนที่น่ารำคาญที่สุด แต่ก็มีส่วนอื่น ๆ ที่ห้องสมุดไม่ได้รับการออกแบบให้ครอบคลุม ตัวอย่างเช่น:
assertContains
สามารถใช้กับสตริงได้ ในขณะที่เวอร์ชันอื่นๆ ไม่อนุญาตexpectExceptionMessageRegExp
ในขณะที่วิธีอื่นๆเรียกว่า expectExceptionMessageMatches
มีโพลีฟิลสำหรับวิธีที่เปลี่ยนแปลงเหล่านี้ (ดูด้านล่าง) แต่ไม่ควรเป็นเรื่องใหญ่ที่จะเขียนโพลีฟิลเฉพาะกิจสำหรับวิธีที่คุณต้องการเท่านั้น เช่น:
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 ();
}
หากมีโพลีฟิลหลายเวอร์ชันแบบโมดูลาร์ (ไม่ใช่) หลายเวอร์ชันสำหรับสิ่งเหล่านี้ และวิธีการอื่น:
yoast/phpunit-polyfills
phpunitgoodpractices/polyfill