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

Options::fake() nahradí manager úložiskom v pamäti: nič sa nedotkne databázy a každý zápis sa zaznamená. Vráti fake (RoundlyConsulting\Options\Testing\OptionsFake, podtriedu OptionsManager) na asercie; každá asercia funguje aj staticky, ako Options::assertSet(…):

use RoundlyConsulting\Options\Facades\Options;

it('records writes from every entry point', function () {
    $fake = Options::fake();
    $user = User::factory()->create();

    Options::set(ThemeOption::class, 'dark');          // the facade
    $user->option(ThemeOption::class)->set('light');   // the HasOptions trait
    LocaleOption::for($user)->forget();                // an option instance

    expect(Options::get(ThemeOption::class))->toBe('dark'); // reads come from memory

    $fake->assertSet(ThemeOption::class, 'dark');          // global scope
    $fake->assertSet(ThemeOption::class, 'light', $user);  // the user's scope
    $fake->assertSet(ThemeOption::class);                  // set to anything, globally
    $fake->assertForgotten(LocaleOption::class, $user);
    $fake->assertNothingImported();
});

it('records imports', function () {
    Options::fake();

    Options::import('[{"key": "theme", "value": "dark"}]');

    Options::assertImported();                                               // static form
    Options::assertImported(fn (array $payloads) => count($payloads) === 1); // list<OptionPayload>
});

it('changes nothing on a read-only page', function () {
    $fake = Options::fake();

    $this->get('/dashboard')->assertOk();

    $fake->assertNothingSet();
    $fake->assertNothingForgotten();
    $fake->assertNothingImported();
});

Asercie

AserciaPrejde, keď
assertSet($option, $value = null, $owner = null)Nastavenie sa v danom rozsahu (null = globálny) zapísalo — na $value v podobe, v akej ste ju odovzdali, alebo na čokoľvek, ak je $value null.
assertNothingSet()Nezapísalo sa vôbec žiadne nastavenie.
assertForgotten($option, $owner = null)Nastavenie sa v danom rozsahu zabudlo (alebo resetovalo).
assertNothingForgotten()Nič sa nezabudlo ani neresetovalo.
assertImported(?Closure $callback = null)Prebehol import() — voliteľne taký, ktorého list<OptionPayload> prejde callbackom.
assertNothingImported()Nič sa neimportovalo.

Čo fake pokrýva

Každá operácia s hodnotou ide cez manager, takže fake vidí všetky: fasádu, OptionsManager získaný po zavolaní faku, handly for() / option() / key() / group(), inštancie nastavení ako ThemeOption::for($user)->set(), trait HasOptions, helpery options() a setting() aj @option. Tam, kde by si to test všimol, sa správa ako skutočný manager:

  • Zápisy sa overujú podľa rules() — neplatný zápis vyhodí výnimku a nezaznamená sa.
  • Čítania vracajú typ castu presne ako s databázou; setMany() a zápisy skupín overia najprv celú dávku.
  • export() a exportJson() čítajú z pamäte so skutočnými pravidlami rozsahov; pamäť drží to, čo by držala databáza — surové reťazce, pri šifrovanom nastavení šifrový text. import() sa zaznamená a nahrá do nej.
  • Kľúče, ktoré ste zaregistrovali cez Options::register() pred zavolaním fake(), sa naďalej nájdu.
  • Riadenie prístupu aj observery naďalej bežia; eventy sa nespúšťajú a cache sa nepoužíva.
  • assertSet() porovnáva hodnotu v podobe, v akej ste ju odovzdali, nie po caste.

Testy s databázou

Pamäť v rámci requestu je naviazaná v kontajneri, takže každý test so svojou novou aplikáciou začína s prázdnou. Trvalá cache však žije vo vašom cache úložisku — ak testy zdieľajú úložisko, ktoré aplikáciu prežije (file, Redis), vyprázdnite ju v beforeEach:

use RoundlyConsulting\Options\Facades\Options;
use RoundlyConsulting\Options\Option;

beforeEach(fn () => Options::flushCache());

it('reads a seeded global value', function () {
    Option::factory()->global()->create(['key' => 'theme', 'value' => 'dark']);

    expect(Options::get(ThemeOption::class))->toBe('dark');
});

Stavy factory

use RoundlyConsulting\Options\Option;

Option::factory()->global()->create(['key' => 'theme', 'value' => 'dark']);
Option::factory()->forOwner($user)->value('light')->create(['key' => 'theme']);
Option::factory()->withMeta(['source' => 'seed'])->create();

Factory zapisuje value bez úprav, preto pri nastaveniach s iným castom ako string ukladajte serializovanú podobu.

Testy samotného balíka

composer test

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.