Základný test case pre balíky
PackageTestCase nahrádza takmer identický tests/TestCase.php, ktorý sa kopíruje do testov každého Laravel balíka. Rozširuje Orchestra Testbench, beží nad SQLite v pamäti so zapnutými obmedzeniami cudzích kľúčov, načítava migrácie podľa triedy providera a konfiguráciu aj výmenu modelov aplikuje ešte pred bootom providerov:
use RoundlyConsulting\Testing\PackageTestCase;
abstract class TestCase extends PackageTestCase
{
protected function packageProviders(): array
{
return [CryptoServiceProvider::class, PasskeysServiceProvider::class];
}
protected function migrationSources(): array
{
return [PasskeysServiceProvider::class];
}
protected function configBeforeBoot(): array
{
return ['passkeys.rp.id' => 'example.test'];
}
}Svoj TestCase deklarujte ako abstract, nikdy nie final: Pest pre každý testovací súbor vygeneruje triedu, ktorá ho rozširuje, takže final TestCase skončí fatálnou chybou PHP hneď pri načítaní testov.
Metódy na prepísanie
| Metóda | Predvolené | Účel |
|---|---|---|
packageProviders() | abstract | Testované service providery v poradí registrácie. Jediná metóda, ktorú musíte implementovať. |
migrationSources() | [] | Triedy providerov (reflexiou preložené na ich adresár database/migrations) a/alebo priame adresáre s migráciami. |
configBeforeBoot() | [] | Konfigurácia aplikovaná v defineEnvironment() pred bootom providerov — miesto na prednastavenie kľúča či výmenu modelu. |
connectionAvailable($connection) | — | Verejný pomocník: či je pomenované pripojenie dostupné. Podmieňte ním asercie na reálnej databáze. |
Migrácie podľa triedy providera
migrationSources() prijíma triedy providerov aj priame adresáre. Provider sa reflexiou preloží na adresár database/migrations svojho balíka (hľadá sa smerom nahor od súboru providera), takže rovnaké volanie funguje pre balík pripojený symlinkom aj pre inštaláciu z VCS. Pomenovať jednotlivý súbor migrácie zámerne nejde — presne táto chyba rozbila testy piatich balíkov. Zdroj, ktorý nie je triedou ani existujúcim adresárom, hlasno zlyhá a samotná kontrola nepridá testu žiadnu aserciu:
protected function migrationSources(): array
{
return [
PasskeysServiceProvider::class, // resolved to its database/migrations by reflection
__DIR__.'/Fixtures/database/migrations', // a literal directory works too
];
}Výmena modelu pred bootom
Providery pri boote vešajú observery a listenery na nakonfigurovanú triedu modelu, preto musí výmena prebehnúť ešte pred bootom. Vráťte ju z configBeforeBoot() alebo zavolajte swapModel() v defineEnvironment() ešte pred odovzdaním riadenia rodičovi, ktorý aplikuje všetky zaregistrované výmeny:
// Either return the swap from the before-boot config window…
protected function configBeforeBoot(): array
{
return ['media.media_model' => CustomMedia::class];
}
// …or register it in defineEnvironment() before the parent applies every swap.
protected function defineEnvironment($app): void
{
$this->swapModel('media.media_model', CustomMedia::class);
parent::defineEnvironment($app);
}Reset stavu bez down()
Roundly balíky migrujú len dopredu a metódu down() nemajú. Testbench bežne resetuje stav príkazom migrate:rollback po každom teste — a keďže migrátor Laravelu chýbajúce down() ticho preskočí, na reálnej databáze tento rollback nespraví nič. Tabuľky prežijú a ďalší test zlyhá na duplicitnej tabuľke, pričom chybová hláška ukazuje na nevinnú migráciu.
PackageTestCase preto reálnu databázu resetuje zmazaním všetkých tabuliek a opätovnou migráciou, potom uzavrie všetky pripojenia, ktoré test otvoril — takže Postgres sada nenecháva otvorený jeden backend na každý test. Na SQLite :memory: odovzdá riadenie Testbench bez zmeny — samotné pripojenie je reset. Nič netreba konfigurovať, stačí rozšíriť základný test case:
abstract class TestCase extends PackageTestCase
{
protected function packageProviders(): array { return [WalletServiceProvider::class]; }
protected function migrationSources(): array { return [WalletServiceProvider::class]; }
}- Sady používajúce RefreshDatabase (alebo LazilyRefreshDatabase) zostávajú nedotknuté — reset si riadia samy.
- Aj sady bez migrácií sa resetujú: tabuľka, ktorú si fixture v jednom teste vytvorí ručne, neprežije do ďalšieho.
- Prečo nie RefreshDatabase ako predvolba: obalí každý test transakciou a pridá tak jednu úroveň — záznamníky zámkov však overujú práve transactionDepth. Zmazanie je čisté DDL a žiadnu transakciu neotvára.
Vlastný TestCase
Ak PackageTestCase nerozširujete, zavolajte DriverMatrix::configure($app) vo vlastnom defineEnvironment() a reset zmazaním tabuliek si zopakujte sami — bez neho vetva s reálnou databázou fungovať nebude.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.