Rumah > Soal Jawab > teks badan
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?
P粉7648364482024-03-27 12:15:40
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
$ php tests/php/autoloading.php
(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:
{
"script": {
"post-autoload-dump": [
"@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
]
}
}
Rujukan:
dan ujinya:
$ composer run-script post-autoload-dump > @php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php PHP Warning: assert(): [ ...
(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:
$ composer exec phpunit -- tests/unit PHPUnit ...
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
:
{
"script": {
"post-autoload-dump": [
"@php -dzend.assertions=1 -dassert.exception=0 tests/php/autoloading.php"
],
"test": [
"@composer dump-autoload",
"@composer exec phpunit"
]
}
}
Dan anda tidak perlu menulis composer run-script test
,只需 composer test
sepanjang masa ia sudah cukup:
$ 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!
(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:
{
"scripts-descriptions": {
"test": "Runs all tests."
}
}
$ composer list ... test Runs all tests. ...
(Lihat: Penerangan Tersuai - Dokumentasi Skrip Komposer)