Testovanie
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
| Asercia | Prejde, 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 testPrejavte 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.