---
title: "Dôkaz výmeny modelu — Testing for Laravel | Roundly"
description: "Spustite reálny tok a dokážte, že každý vytvorený model je podtrieda hostiteľa — podľa konkrétnej triedy a udalostí created, nie instanceof."
url: https://roundly-consulting.com/sk/open-source/navody/testing-for-laravel/vymena-modelu
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Testing for Laravel](https://roundly-consulting.com/sk/open-source/navody/testing-for-laravel.md)

# 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:

```php
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:

```php
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:

```php
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/testing-for-laravel.md)
