Saya mempunyai projek dengan struktur berikut:
- src + Guitar.php + Type.php + ToString.php - tests + GuitarTest.php composer.json
Beginilah saya mentakrifkan autoloading psr-4 dalam composer.json:
"autoload": { "psr-4": { "Shop\Guitar\": "src/" } }
Ini Gitar saya.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) { } }
Ini ToString.php saya:
<?php namespace Shop\Guitar; require_once __DIR__ . '/../vendor/autoload.php'; interface ToString { public function toString(): string; }
Ini adalah Jenis saya.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', }; } }
Ini GuitarTest saya.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); } }
Tetapi apabila saya menjalankan ujian, saya mendapat ralat berikut:
Error: Class "Shop\Guitar\Guitar" not found
Apa masalahnya? Bagaimana untuk menyelesaikan?
Ini hanyalah soalan tentang pemuat auto Komposer dalam konfigurasi PSR-4.
require_once
panggilan tidak akan. Ini ialah autoloader, dan fail kelas mestilah tidak memerlukan autoloader.Jika ragu-ragu, uji konfigurasi pemuat auto anda.
Langkah seterusnya:
Alih keluar
require_once
panggilan itu, ia hanya mengalih perhatian anda dan menghalang penyelesaian masalah. Konfigurasi autoload sama ada sah atau tidak sah. Ia memerlukan lebih banyak penyelenggaraan jika anda menyebarkan mata termasuk ke atas fail yang berbeza, tetapi sama sekali tidak perlu berbuat demikian.Susun semula
测试
modul anda untuk memperkenalkan ujian konfigurasi autoloader kerana anda menghadapi masalah:Alihkan kandungan dari
tests
移至tests/unit
dan sediakan direktori khusus untuk ujian unit.Dicipta
tests/php
子文件夹并在其中创建autoloading.php
文件。该文件夹用于 PHP 测试,即直接使用 PHP 执行它们(例如phptests/php/autoloading.php
). Kandungan fail:Rujukan:
Jalankan ujian konfigurasi autoloader untuk menyemak sama ada fail boleh dimuatkan
(Ia tidak boleh mencetak apa-apa, tetapi ia mungkin mencetak apa-apa. Perkara penting ialah ia berjalan, dan bukan fail tidak ditemui atau jenis ralat yang serupa.
Jika anda dapat melaksanakan fail PHP dengan cara ini, ikat ia ke dalam konfigurasi Komposer anda. Ini membolehkan anda menguji konfigurasi autoloader.
Tambah skrip baharu pada konfigurasi
composer.json
anda:Rujukan:
dan ujinya:
(Ia tidak memberikan output, di sini saya menambah beberapa amaran untuk menunjukkan rupanya)
Ini akan menjalankan ujian konfigurasi autoload baharu dan mendayakan penegasan dalam mod amaran. Iaitu, jika mana-mana ***_exists() fungsi mengembalikan palsu, anda akan melihat ralat. Ini bermakna antara muka/penghitungan/kelas tidak boleh dimuatkan.
Anda boleh lulus
-dassert.exception=0
更改为-dassert.exception=1
(0
-> 1代码>)。然后测试将以非零代码退出(状态255
untuk pengecualian yang tidak ditangkap).Ini yang anda mahu, akan
-dassert.exception=0
更改为-dassert.exception=1
并再次保存composer.json
.Anda kemudian boleh menguji pemuat auto anda menggunakan mana-mana arahan Komposer yang membuang pemuat auto:
作曲家转储自动加载
作曲家安装
作曲家更新
Selamat mencuba.
Ujian yang betul, mungkin juga semak sama ada phpunit masih berjalan:
Uji sekali lagi, apabila anda menemui pelakunya dan semuanya kembali normal, anda boleh menjalankan semua ujian menggunakan skrip penulis tunggal.
Biasa ialah skrip dengan perkataan
test
:Dan anda tidak perlu menulis
composer run-script test
,只需composer test
sepanjang masa ia sudah cukup:(Dalam output contoh ini, saya belum mengkonfigurasi ujian phpunit, tetapi anda mendapat idea)
Jadi apakah jenis ujian ini? Baiklah, saya memanggilnya ujian konfigurasi, ia hanya semakan pantas di mana anda boleh mengesahkan beberapa perkara PHP. Jangan tambah banyak ujian sedemikian dan pastikan pelan ujian anda kecil. Anda boleh menggunakannya untuk menyelesaikan masalah yang anda hadapi semasa mengkonfigurasi projek anda. Simpan sehingga setahun dan jika anda kekal bebas ralat, maka anda boleh mempertimbangkan untuk memadamkannya.
Walau bagaimanapun, contoh ini menunjukkan cara untuk mengalihkan beberapa cek lebih dekat ke lokasi yang dikonfigurasikan dan mengikatnya bersama-sama. Jika terdapat status keluar bukan sifar, Komposer akan gagal keseluruhan proses.
Selain itu, anda boleh menambah penerangan pada setiap skrip penulis supaya mesej dipaparkan:
(Lihat: Penerangan Tersuai - Dokumentasi Skrip Komposer)