NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Testing for Laravel

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);
ParameterTypVýznam
$configKeystringKonfiguračný kľúč, ktorý model vymieňa, napr. media.media_model.
$subclassclass-stringPodtrieda hostiteľa — nastavená v konfigurácii pred bootom. Musí používať CountsCreations.
$exerciseClosure(): Model|iterable<Model>Spustí reálny tok a vráti model(y), ktoré vytvoril.
$expectsCreationbool (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 kryptomien

Odoslaní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.