Dôkaz výmeny modelu
Dokáže, že balík rešpektuje nakonfigurovanú výmenu modelu: spustí reálny tok a overí konkrétnu triedu každého modelu, ktorý vznikne — nielen instanceof:
expect($configKey)->toHonourModelSwap(string $subclass, Closure $exercise, bool $expectsCreation = true);| Parameter | Typ | Význam |
|---|---|---|
$configKey | string | Konfiguračný kľúč, ktorý model vymieňa, napr. media.media_model. |
$subclass | class-string | Podtrieda hostiteľa — nastavená v konfigurácii pred bootom. Musí používať CountsCreations. |
$exercise | Closure(): Model|iterable<Model> | Spustí reálny tok a vráti model(y), ktoré vytvoril. |
$expectsCreation | bool (true) | Či tok vytvára riadok. Pre toky, ktoré len čítajú, zadajte false. |
Podtrieda hostiteľa musí používať dodaný trait CountsCreations:
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use RoundlyConsulting\MediaLibrary\Models\Media;
use RoundlyConsulting\Testing\Fixtures\Concerns\CountsCreations;
class CustomMedia extends Media
{
use CountsCreations;
}
// config('media.media_model') swapped to CustomMedia::class before boot
it('honours the media model swap', function (): void {
Storage::fake('public');
$user = User::factory()->create();
expect('media.media_model')->toHonourModelSwap(CustomMedia::class, function () use ($user) {
// the real flow, not a resolver string check
$media = $user->addMedia(UploadedFile::fake()->image('me.jpg'))->toMediaBucket('avatar');
return [$media, $user->getFirstMedia('avatar')];
});
});Čo overuje
- Okamžite zlyhá, ak config($configKey) nie je $subclass — výmena neprebehla pred bootom. Použite configBeforeBoot() alebo swapModel().
- Konkrétna trieda ($model::class) každého vráteného modelu sa musí rovnať $subclass. instanceof nestačí: pomocník so static::query() v modeli balíka vytvorí riadok ako triedu balíka, takže udalosti modelu hostiteľa sa nikdy nespustia.
- Na $subclass musí dopadnúť aspoň jedna udalosť created, ktorú počíta CountsCreations — jediný dôkaz, že riadok naozaj vznikol ako trieda hostiteľa.
- Tok, ktorý nevráti žiadny model alebo vráti niečo iné než model, hlasno zlyhá — presne takýto test resolvera, ktorý overuje len vrátený reťazec, táto asercia nahrádza.
Toky, ktoré nič nevytvárajú
CountsCreations je povinný, nezisťuje sa automaticky — chýbajúci trait zlyhá s návodom, takže nikto nedostane pod rovnakým názvom slabší dôkaz. Pri toku, ktorý len číta existujúce riadky, to uveďte explicitne:
expect('media.media_model')->toHonourModelSwap(
CustomMedia::class,
fn () => $user->getFirstMedia('avatar'), // reads an existing row, creates nothing
expectsCreation: false,
);CountsCreations
Trait sa napojí na vlastnú udalosť created modelu, takže počítadlo rastie len pri riadkoch vytvorených ako presne táto trieda. resetCreationCount() a creationCount() sú verejné statické metódy; asercia pred spustením toku počítadlo vynuluje, takže výsledok odráža len daný tok.
Prečo vznikol
Pokazené miesta výmeny modelov boli najväčšou triedou chýb naprieč našimi balíkmi: implicitné kľúče hasMany odvodené z názvu rodičovskej triedy, holé belongsToMany() odvodzujúce pivot, static::query() v pomocníkovi findOrCreate, natvrdo zapísané volania vedľa rešpektovanej konfigurácie a final práve na triede, ktorú mal hostiteľ rozšíriť.
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.