ฉันจะให้วิธีแก้ปัญหาสกปรกที่นี่ ซึ่งสามารถคัดลอกได้ง่ายโดยไม่ต้องปรับโค้ดใดๆ
อาจมีวิธีแก้ปัญหาที่ดีกว่า ฉันเปิดรับคำตอบอื่น ๆ !
นอกจากนี้ ฉันจะไม่สัญญา 100% ว่าจะได้ผลในทุกสถานการณ์ บางที opcache อาจนำมาซึ่งความประหลาดใจที่น่ารังเกียจ?
สร้างไฟล์ต่อไปนี้ใน "การทดสอบ/src/$modulename/Traits/AutoloadHelperTrait.php"
.
แทนที่ <MODULENAME>
ด้วยชื่อโมดูลจริง
<?php
/**
* @ไฟล์
* ลงทะเบียนไดเร็กทอรี 'tests/src/' ทั้งหมดในคลาสโหลดเดอร์
*
* ตามค่าเริ่มต้น การรวม Drupal phpunit จะลงทะเบียนเนมสเปซ _some_ เท่านั้น
* ไดเร็กทอรีภายใน 'tests/src/' ในตัวโหลดคลาส หนึ่งในนั้นคือ
* '/ลักษณะนิสัย/'.
* วิธีแก้ไขปัญหานี้จะลงทะเบียนเนมสเปซระดับบนสุด
*
* โค้ดเขียนในลักษณะที่สามารถคัดลอกไปยังโมดูลอื่นได้ง่าย:
* - ไม่ขึ้นกับชื่อโมดูล
* - ไม่ขึ้นกับตำแหน่งของโมดูลในระบบไฟล์
*
* ดู https://drupal.stackexchange.com/questions/309143/autoload-helper-classes-in-tests-src-for-phpunit-in-contrib-module
*
* @ดู \drupal_phpunit_populate_class_loader()
* @ดู \drupal_phpunit_get_extension_namespaces()
*/
ประกาศ (เข้มงวด_types = 1);
เนมสเปซ Drupal\Tests\<MODULENAME>\Traits;
ใช้นักแต่งเพลง \ Autoload \ ClassLoader;
\call_user_func(ฟังก์ชันคงที่ (): โมฆะ {
// คลาส Composer ClassLoader จะแสดงในตำแหน่งเดียวกันเสมอ
// ภายในไดเร็กทอรีผู้ขาย จากที่นั่นเราสามารถเดินทางไปที่
// autoload.php เพื่อรับตัวโหลดคลาสจริง
$rc = ใหม่ \ReflectionClass(ClassLoader::class);
/** @var \Composer\Autoload\ClassLoader $classLoader */
$classLoader = ต้องการ dirname($rc->getFileName(), 2) '/autoload.php';
// กำหนดเนมสเปซและไดเร็กทอรีจากค่าคงที่เวท
// สิ่งนี้อนุญาตให้คัดลอกรหัสไปที่อื่น
$level = \substr_count(__NAMESPACE__, '\');
$dir = dirname(__DIR__, $ระดับ - 2);
// เนมสเปซจะขึ้นต้นด้วย 'Drupal\Tests\' เสมอ โดยไม่ขึ้นกับ
// ชื่อโมดูล
$nspos = \strpos(__NAMESPACE__, '\', 13);
$namespace = \substr(__NAMESPACE__, 0, $nspos + 1);
$classLoader->addPsr4($เนมสเปซ, $dir);
});
/**
* รวมคุณสมบัตินี้เพื่อลงทะเบียนการทดสอบทั้งหมด/src/ สำหรับการโหลดชั้นเรียน
*/
ลักษณะ AutoloadHelperTrait {}
รวมคุณลักษณะนี้ในคลาสทดสอบที่ต้องการเปิดใช้งานการโหลดอัตโนมัตินี้ หรือรวมจากคลาสพื้นฐานการทดสอบ