---
title: "Testovanie — Tags for Laravel | Roundly"
description: "Tags::fake() zaznamená každú operáciu a aj tak ju vykoná — každá asercia a jej negatívna dvojička, zaznamenané operácie, matchery pre Pest a factory."
url: https://roundly-consulting.com/sk/open-source/navody/tags-for-laravel/testovanie
language: sk
---

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

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

# Testovanie

Tags::fake() vymení manažéra za TagsFake a vráti ho:

```php
use RoundlyConsulting\Tags\Facades\Tags;
use RoundlyConsulting\Tags\Models\Tag;

it('labels a concert', function () {
    $tags = Tags::fake();

    $concert = Concert::factory()->create();
    $concert->attachTags(['live'], 'label');           // what your action does inside

    $tags->assertTagged($concert, ['live'], type: 'label');
    $tags->assertNothingUntagged();
    $tags->assertTagCreated(fn (Tag $tag) => $tag->slug === 'live');
});
```

- Je to nahrávací fake, ktorý volania aj tak vykoná: každé volanie prebehne naozaj — riadky, počty, udalosti — a každá úspešná operácia sa zaznamená. Volanie, ktoré vyhodí výnimku, nezaznamená nič.
- Vymení sa za fasádou aj v kontajneri a dedí od TagsManager, takže aj injektovaný manažér je fake a typovo stále sedí. Zaznamená fasádu, injektovaného manažéra, handle, builder, metódu modelu aj JSON API; priame volanie triedy akcie sa nezaznamená.
- Keďže volania vykonáva, test s fake potrebuje databázu (publikované migrácie) ako každý iný.
- Udalosti Laravelu nefakuje — vedľa neho použite Event::fake().

## Asercie

Asercie sú v pároch: assert<Verb>() s assertNothing<Verb>() pre metódy označovania, assert<Noun><Verb>() s assertNo<Noun><Verb>() pre katalóg. Každá je zdokumentovaná aj na fasáde, takže funguje aj Tags::assertTagged(…):

| Asercia | Negatívna | Význam |
| --- | --- | --- |
| `assertTagged($model, ?array $tags = null, $type = null)` | `assertNothingTagged()` | Štítky pripojené cez attach alebo sync — voliteľne tieto (modely alebo názvy v aktuálnom jazyku) daného typu. |
| `assertUntagged($model, ?array $tags = null, $type = null)` | `assertNothingUntagged()` | Štítky odpojené cez detach, sync alebo clear. |
| `assertSynced($model, $type, ?array $tags = null)` | `assertNothingSynced()` | Typ bol synchronizovaný — so štítkami model teraz nesie presne tieto. |
| `assertCleared($model, $type = null)` | `assertNothingCleared()` | Clear typu (null: akýkoľvek) — započíta sa aj clear pri natrvalo zmazanom modeli. |
| `assertTagCreated(?Closure $callback = null)` | `assertNoTagCreated()` | create(), findOrCreate(), ktorý vytváral, alebo voľný názov vytvorený cez attach či sync. Obnovený štítok sa ráta ako obnovený. |
| `assertTagUpdated(?Closure $callback = null)` | `assertNoTagUpdated()` | update(), rename() alebo edit()->save(). |
| `assertTagMoved(?Closure $callback = null)` | `assertNoTagMoved()` | move(). |
| `assertTagDeleted(?Closure $callback = null)` | `assertNoTagDeleted()` | delete(). |
| `assertTagRestored(?Closure $callback = null)` | `assertNoTagRestored()` | restore() alebo zmazaný štítok, ktorý vrátil create, findOrCreate, attach či sync. |
| `assertTagsReordered($type = null)` | `assertNoTagsReordered()` | reorder(), voliteľne jedného typu. |
| `assertRepaired(?Closure $callback = null)` | `assertNothingRepaired()` | Tags::repair() alebo tags:repair; callback dostane RepairReport. |
| `assertNothingHappened()` | — | Nebola zaznamenaná žiadna operácia. |

```php
$tags->assertTagged($concert);                              // any tag attached (an attach or a sync)
$tags->assertTagged($concert, [$jazz, 'live'], 'label');   // these tags — models, or names in the current locale
$tags->assertUntagged($concert, ['outdoor'], 'label');     // a detach, a sync or a clear
$tags->assertSynced($concert, 'genre', [$jazz]);           // synced, and the model now carries exactly these
$tags->assertCleared($concert, 'label');                   // null type = any clear (a force delete's included)

$tags->assertTagCreated(fn (Tag $tag) => $tag->type === 'genre');
$tags->assertTagUpdated();
$tags->assertTagMoved();
$tags->assertTagDeleted();
$tags->assertTagRestored();
$tags->assertTagsReordered('genre');
$tags->assertRepaired(fn (RepairReport $report) => $report->isClean());

$tags->assertNothingHappened();
```

## Zaznamenané operácie

$fake->recorded(?TagOperation $operation = null) vráti surové záznamy RecordedTagOperation v poradí volaní. TagOperation uvádza každú meniacu metódu: attach, detach, sync, clear, create\_tag, find\_or\_create\_tag, update\_tag, move\_tag, reorder\_tags, delete\_tag, restore\_tag a repair:

```php
use RoundlyConsulting\Tags\Enums\TagOperation;

foreach ($tags->recorded(TagOperation::Sync) as $operation) {
    $operation->operation;        // TagOperation::Sync
    $operation->context;          // ['taggable' => …, 'tags' => […], 'type' => 'genre']
    $operation->result;           // TagChanges
    $operation->changes();        // TagChanges, or null for a catalog operation
    $operation->concerns($concert);
    $operation->changesType();    // 'genre'
}
```

## Matchery pre Pest

```php
// tests/Pest.php
use RoundlyConsulting\Tags\Testing\TagExpectations;

TagExpectations::register();

// any test
expect($concert)->toHaveTags(['live', 'outdoor'], 'label');
expect($concert)->toHaveNoTags('genre');
expect($concert)->toHaveNoTags();
```

toHaveTags() overí každý štítok cez hasTag() — model, kľúč, názov alebo slug; toHaveNoTags() overí jeden typ alebo všetky typy. Ak funkcia expect() z Pestu neexistuje, register() nedefinuje nič.

## Factory štítkov

```php
use RoundlyConsulting\Tags\Models\Tag;

$music = Tag::factory()->ofType('genre')->named(['en' => 'Music', 'sk' => 'Hudba'])->create();
$jazz = Tag::factory()->under($music)->named('Jazz')->create();      // type, scope, path and depth from the parent
$ours = Tag::factory()->ofType('label')->within($team)->create();
$any = Tag::factory()->create();                                     // type tag, a unique name in the current locale
```

Riadky z factory obchádzajú akcie balíka — žiadne udalosti, počty použití ani zámok stromu — preto tam, kde ich test potrebuje, vytvárajte štítky cez Tags::type(). Factory vytvára nakonfigurovaný model štítku. Modely so štítkami označujte v afterCreating (pozrite Modely so štítkami).

## Testovanie aplikácie

- Nepotrebujete žiadne špeciálne prostredie: publikované migrácie sú bežné migrácie, takže RefreshDatabase funguje na SQLite 3.38+ v pamäti rovnako ako na MySQL či PostgreSQL.
- Jazyk testov držte v translatable.locales, inak označovanie podľa názvu vyhodí výnimku.
- Definujte Gate oprávnenia, na ktorých stoja vaše testy API (tags.manage, tags.scope) — nedefinované oprávnenia zamietajú.
- API je vypnuté, kým pred štartom aplikácie nenastavíte TAGS\_ROUTES=on — v phpunit.xml používajte hodnoty on / off, pretože PHPUnit premení false na prázdny reťazec, ktorý znamená predvolenú hodnotu.

```xml
<php>
    <env name="TAGS_ROUTES" value="on"/>
</php>
```

## 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/tags-for-laravel.md)
