Score:1

คลาสตัวช่วยโหลดอัตโนมัติในการทดสอบ / src / สำหรับ phpunit ในโมดูล contrib

ธง in

ฉันกำลังทำงานกับโมดูลสนับสนุนด้วยการทดสอบ phpunit

ขณะนี้ไม่มีผู้แต่ง json หรือ phpunit.xml หรือรูทีนการติดตั้งในตัวโมดูลเอง แต่ต้องทำการทดสอบการทำงานและเบราว์เซอร์จากไซต์ drupal ที่กำหนดเอง ซึ่งติดตั้งโมดูลใน web/modules/contrib/* จนถึงขณะนี้ใช้งานได้

ตอนนี้ฉันต้องการใช้คลาสตัวช่วยใน การทดสอบ/src/ตัวช่วย/ในเนมสเปซ "Drupal\Tests\$modulename\Helper\" และอาจอยู่ที่อื่น

อย่างไรก็ตามฉันสังเกตเห็นว่า drupal_phpunit_get_extension_namespaces() ลงทะเบียนเฉพาะบางเนมสเปซที่เลือกภายใน "Drupal\Tests\$ชื่อโมดูล\"แทนที่จะเป็นเนมสเปซทั้งหมด

คำถามของฉัน:

  • เหตุใดการผสานรวม phpunit ของ Drupal จึงทำงานในลักษณะนี้ แทนที่จะลงทะเบียนทั้งหมด การทดสอบ/src/ ไดเร็กทอรีเนมสเปซ?
  • วิธีที่ดีในการลงทะเบียนทั้งหมดคืออะไร การทดสอบ/src/ ไดเร็กทอรีในตัวโหลดคลาส? ฉันยังต้องการที่จะเรียกใช้การทดสอบจากการติดตั้ง Drupal ภายนอกโมดูลได้

แก้ไข: ปัญหาใหม่ใน drupal.org: #3258817: ทำไมเราไม่ลงทะเบียน /tests/src/ ทั้งหมดสำหรับการโหลดคลาส

Score:0
ธง in

ฉันจะให้วิธีแก้ปัญหาสกปรกที่นี่ ซึ่งสามารถคัดลอกได้ง่ายโดยไม่ต้องปรับโค้ดใดๆ

อาจมีวิธีแก้ปัญหาที่ดีกว่า ฉันเปิดรับคำตอบอื่น ๆ !

นอกจากนี้ ฉันจะไม่สัญญา 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 {}

รวมคุณลักษณะนี้ในคลาสทดสอบที่ต้องการเปิดใช้งานการโหลดอัตโนมัตินี้ หรือรวมจากคลาสพื้นฐานการทดสอบ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา