Testovanie
Tags::fake() vymení manažéra za TagsFake a vráti ho:
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. |
$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:
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
// 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
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 localeRiadky 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.
<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 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.