Maison > Questions et réponses > le corps du texte
J'ai un projet avec la structure suivante :
- src + Guitar.php + Type.php + ToString.php - tests + GuitarTest.php composer.json
Voici comment je définis le chargement automatique psr-4 dans composer.json :
"autoload": { "psr-4": { "Shop\Guitar\": "src/" } }
Voici mon Guitar.php :
<?php namespace Shop\Guitar; require_once __DIR__ . '/../vendor/autoload.php'; use Shop\Guitar\Type; class Guitar { public function __construct(public readonly string $serialNumber, public readonly Type $type) { } }
Voici mon ToString.php :
<?php namespace Shop\Guitar; require_once __DIR__ . '/../vendor/autoload.php'; interface ToString { public function toString(): string; }
Voici mon Type.php :
<?php namespace Shop\Guitar; require_once __DIR__ . '/../vendor/autoload.php'; enum Type implements ToString { case ACOUSTIC; case ELECTRIC; public function toString(): string { return match($this) { self::ACOUSTIC => 'Acoustic', self::ELECTRIC => 'Electric', }; } }
Voici mon GuitarTest.php :
<?php require_once __DIR__ . '/../vendor/autoload.php'; use PHPUnit\Framework\TestCase; use Shop\Guitar\Guitar; use Shop\Guitar\Type; final class InventoryTest extends TestCase { public function testGuitarConstructor(): void { $guitar = new Guitar('foo', Type::ELECTRIC); } }
Mais lorsque j'exécute le test, j'obtiens l'erreur suivante :
Error: Class "Shop\Guitar\Guitar" not found
Quel est le problème ? Comment résoudre?
P粉7648364482024-03-27 12:15:40
Ceci est juste une question sur le chargeur automatique Composer en configuration PSR-4.
require_once
les appels ne le seront pas. Il s'agit d'un chargeur automatique et les fichiers de classe ne doivent pas nécessiter de chargeur automatique. En cas de doute, testez la configuration de votre autoloader.
Prochaines étapes :
Supprimez ces require_once
appels, ils ne font que vous distraire et gêner le dépannage. La configuration du chargement automatique est valide ou non valide. Cela nécessite plus de maintenance si vous répartissez les points d'inclusion sur différents fichiers, mais ce n'est absolument pas nécessaire.
Réorganisez vos 测试
modules pour introduire des tests de configuration de l'autoloader car vous rencontrez des problèmes :
Déplacez le contenu de tests
移至 tests/unit
et fournissez un répertoire dédié aux tests unitaires.
Créé tests/php
子文件夹并在其中创建 autoloading.php
文件。该文件夹用于 PHP 测试,即直接使用 PHP 执行它们(例如 phptests/php/autoloading.php
). Contenu du fichier :
Référence :
Exécutez le test de configuration du chargeur automatique pour vérifier si le fichier peut être chargé
$ php tests/php/autoloading.php
(Il ne peut rien imprimer, mais il peut imprimer n'importe quoi. L'important est qu'il s'exécute, et non un fichier introuvable ou un type d'erreur similaire.
Si vous parvenez à exécuter des fichiers PHP de cette façon, liez-les à votre configuration Composer. Cela vous permet de tester la configuration du chargeur automatique.
Ajoutez un nouveau script à votre composer.json
configuration :
{
"script": {
"post-autoload-dump": [
"@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
]
}
}
Référence :
et testez-le :
$ composer run-script post-autoload-dump > @php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php PHP Warning: assert(): [ ...
(Cela ne donne pas de résultat, ici j'ai ajouté quelques avertissements pour montrer à quoi cela ressemble)
Cela exécutera le nouveau test de configuration de chargement automatique et activera les assertions en mode avertissement. Autrement dit, si une fonction ***_exists() renvoie false, vous verrez une erreur. Cela signifie que l'interface/l'énumération/la classe ne peut pas être chargée.
Vous pouvez passer -dassert.exception=0
更改为 -dassert.exception=1
(0
-> <代码>1代码>)。然后测试将以非零代码退出(状态 255
pour les exceptions non détectées).
C'est ce que tu veux, will -dassert.exception=0
更改为 -dassert.exception=1
并再次保存 composer.json
.
Vous pouvez ensuite tester votre autoloader à l'aide de n'importe quelle commande Composer qui vide l'autoloader :
作曲家转储自动加载
作曲家安装
作曲家更新
Bon test.
Un test approprié, peut-être aussi vérifier si phpunit est toujours en cours d'exécution :
$ composer exec phpunit -- tests/unit PHPUnit ...
Testez à nouveau, lorsque vous trouvez le coupable et que tout est revenu à la normale, vous pouvez exécuter tous les tests en utilisant un seul script d'écriture.
Common est un script avec le mot test
:
{
"script": {
"post-autoload-dump": [
"@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
],
"test": [
"@composer dump-autoload",
"@composer exec phpunit"
]
}
}
Et tu n’as pas besoin d’écrire composer run-script test
,只需 composer test
tout le temps ça suffit :
$ composer test
Generating autoload files
Generated autoload files
> @php -dzend.assertions=1 -dassert.exception=1 tests/php/autoloading.php
PHPUnit ...
Time: 28 ms, Memory: 4.00MB
No tests executed!
(Dans cet exemple de sortie, je n'ai pas configuré les tests phpunit, mais vous voyez l'idée)
Alors, de quel genre de test s'agit-il ? Eh bien, j'appelle cela un test de configuration, c'est juste une vérification rapide où vous pouvez vérifier certaines choses PHP. N'ajoutez pas beaucoup de tests de ce type et gardez votre plan de test petit. Vous pouvez l'utiliser pour résoudre les problèmes que vous rencontrez lors de la configuration de votre projet. Conservez-le jusqu'à un an et si vous restez sans erreur, vous pouvez envisager de le supprimer.
Cependant, cet exemple montre comment rapprocher certains chèques de l'emplacement configuré et les lier ensemble. S'il y a un état de sortie différent de zéro, Composer fera échouer l'ensemble du processus.
De plus, vous pouvez ajouter une description à chaque script d'écrivain afin qu'un message s'affiche :
{
"scripts-descriptions": {
"test": "Runs all tests."
}
}
$ composer list ... test Runs all tests. ...
(Voir : Description personnalisée - Documentation du script du compositeur)