Puncte:1

Încărcare automată a claselor de ajutor în tests/src/ pentru phpunit în modulul contrib

drapel in

Lucrez la un modul contrib cu teste phpunit.

În prezent, nu există nicio rutină de instalare composer.json sau phpunit.xml în modulul în sine, în schimb trebuie să rulați testele funcționale și ale browserului de pe un site drupal personalizat, unde modulul este instalat în web/modules/contrib/*. Până acum funcționează.

Acum vreau să folosesc clase de ajutor în teste/src/Helper/, în spațiul de nume „Drupal\Teste\$modulename\Helper\” și eventual în altă parte.

Totuși, am observat asta drupal_phpunit_get_extension_namespaces() înregistrează doar unele spații de nume selectate în interior „Drupal\Teste\$modulename\”, în loc de întregul spațiu de nume.

Intrebarile mele:

  • De ce integrarea Drupal phpunit se comportă astfel, în loc să înregistreze întregul teste/src/ directorul spațiilor de nume?
  • Care este o modalitate bună de a înregistra întregul teste/src/ directorul din încărcătorul de clasă? Încă vreau să pot rula testele din instalarea Drupal în afara modulului în sine.

EDIT: Noua emisiune pe drupal.org: #3258817: De ce nu înregistrăm toate /testurile/src/ pentru încărcarea clasei?

Puncte:0
drapel in

Voi oferi aici o soluție murdară, care poate fi copiată cu ușurință fără a ajusta niciun cod.

S-ar putea să fie soluții mai bune, sunt deschis pentru alte răspunsuri!

De asemenea, nu voi promite 100% că acest lucru funcționează în toate circumstanțele. Poate că opcache poate aduce surprize urâte?

Creați următorul fișier în „tests/src/$modulename/Traits/AutoloadHelperTrait.php”. A inlocui <MODULENAME> cu numele real al modulului.

<?php

/**
 * @fișier
 * Înregistrează întregul director „tests/src/” în încărcătorul de clasă.
 *
 * În mod implicit, integrarea Drupal phpunit înregistrează doar _un_name_space
 * directoarele din „tests/src/” din încărcătorul de clasă. Unul dintre ei este
 * „/Trăsături/”. 
 * Această soluție înregistrează spațiul de nume de nivel superior.
 *
 * Codul este scris într-un mod care poate fi ușor copiat în alte module:
 * - Este independent de numele modulului.
 * - Este independent de locul în care este plasat modulul în sistemul de fișiere.
 *
 * Vedeți https://drupal.stackexchange.com/questions/309143/autoload-helper-classes-in-tests-src-for-phpunit-in-contrib-module
 *
 * @vedeți \drupal_phpunit_populate_class_loader()
 * @vedeți \drupal_phpunit_get_extension_namespaces()
 */

declare(strict_types=1);

spațiu de nume Drupal\Tests\<NUME MODUL>\Trasături;

utilizați Composer\Autoload\ClassLoader;

\call_user_func(funcție statică (): void {
  // Clasa Composer ClassLoader este întotdeauna prezentă în aceeași locație
  // în directorul furnizorului. De acolo ne putem parcurge drumul spre
  // autoload.php pentru a obține încărcătorul de clasă reală. 
  $rc = nou \ReflectionClass(ClassLoader::class);
  /** @var \Composer\Autoload\ClassLoader $classLoader */
  $classLoader = require dirname($rc->getFileName(), 2) . '/autoload.php';
  // Determinați spațiul de nume și directorul din constantele magice.
  // Aceasta permite ca codul să fie copiat în altă parte.
  $level = \substr_count(__NAMESPACE__, '\');
  $dir = dirname(__DIR__, $nivel - 2);
  // Spațiul de nume începe întotdeauna cu „Drupal\Tests\”, independent de
  // numele modulului.
  $nspos = \strpos(__NAMESPACE__, '\', 13);
  $namespace = \substr(__NAMESPACE__, 0, $nspos + 1);
  $classLoader->addPsr4($namespace, $dir);
});

/**
 * Includeți această trăsătură pentru a înregistra întregul test/src/ pentru încărcarea clasei.
 */
caracteristică AutoloadHelperTrait {}

Acum includeți trăsătura în orice clasă de testare care necesită activarea acestei încărcări automate. Sau includeți-l dintr-o clasă de bază de testare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.