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

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č. Volanie, ktoré nič nezmenilo — obnova živého štítku, úprava bez zmeny atribútu, zmazanie zmazaného štítku, presun tam, kde štítok už je, zoradenie na aktuálne poradie —, sa zaznamená (recorded() ho uvedie), no nezaráta sa do žiadnej asercie katalógu, rovnako ako nespustí udalosť.
  • 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(…):

AserciaNegatívnaVý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). Clear všetkých typov — clearTags() alebo clear pri natrvalo zmazanom modeli — sa ráta pre každý typ.
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(), ktoré zmenili atribút.
assertTagMoved(?Closure $callback = null)assertNoTagMoved()move() k inému rodičovi alebo na inú pozíciu.
assertTagDeleted(?Closure $callback = null)assertNoTagDeleted()delete() živého štítku.
assertTagRestored(?Closure $callback = null)assertNoTagRestored()restore() zmazaného štítku alebo zmazaný štítok, ktorý vrátil create, findOrCreate, attach či sync.
assertTagsReordered($type = null)assertNoTagsReordered()Zoradenie, ktoré zmenilo pozíciu, 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. Obe čítajú databázu, nikdy vzťah tags načítaný skôr, než zapisovala iná inštancia; testovaný model si svoj načítaný vzťah ponechá. 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 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.
<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

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.