Testovanie
Credits::fake() nahradí manažéra záznamníkom, ktorý nezapisuje žiadny záznam do knihy pohybov ani nespúšťa udalosti, a vráti ho. Náhrada platí pre fasádu, každý injektovaný CreditsManager, metódy modelu z HasCredits aj credits:modify:
use RoundlyConsulting\Credits\Facades\Credits;
$fake = Credits::fake();
// ... run the code under test ...
$fake->assertAdded($user, 100, bucket: 'points'); // amount and bucket optional
$fake->assertDeducted($user, 30); // the positive amount, as passed to deduct()
$fake->assertSet($user, 0); // the requested target
$fake->assertNothingAdded();
$fake->assertNothingDeducted();
$fake->assertNothingSet();
$fake->assertNothingModified(); // no add, deduct or set at all- assertAdded($owner, ?$amount, ?$bucket) / assertNothingAdded() — pripísania podľa vlastníka a voliteľne sumy a skupiny.
- assertDeducted($owner, ?$amount, ?$bucket) / assertNothingDeducted() — odpisy podľa kladnej sumy, ako ju dostalo deduct().
- assertSet($owner, ?$amount, ?$bucket) / assertNothingSet() — volania setTo() podľa požadovaného cieľa.
- assertNothingModified() — žiadne pripísanie, odpis ani nastavenie.
Fake si vedie knihu pohybov v pamäti. Zostatky ju pripočítajú k skutočným záznamom vlastníka, takže pripísanie cez fake sa dá cez fake aj minúť. Ochrana pred prečerpaním platí ďalej: odpis, ktorý by skutočný manažér odmietol, vyhodí InsufficientCreditsException a nezaznamená sa. setTo() sa zaznamená, aj keď zostatok už sedí.
Proti skutočnej databáze
Keď test overuje samotnú knihu pohybov, testujte proti skutočnej databáze s RefreshDatabase — publikovaná migrácia prebehne ako každá iná. Zapisujte cez verejné API a cez neho aj overujte:
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Credits\Events\CreditsModified;
use RoundlyConsulting\Credits\Exceptions\InsufficientCreditsException;
uses(RefreshDatabase::class);
it('grants and spends credits', function () {
$user = User::factory()->create();
$user->modifyCredits(100, 'signup bonus');
$user->modifyCredits(-30, 'purchase', ['order_id' => 42]);
expect($user->creditsBalance())->toBe(70)
->and($user->hasCredits(50))->toBeTrue()
->and($user->credits()->count())->toBe(2);
});
it('refuses to overdraw and writes nothing', function () {
$user = User::factory()->create();
$user->modifyCredits(20);
expect(fn () => $user->modifyCredits(-50))
->toThrow(InsufficientCreditsException::class);
expect($user->creditsBalance())->toBe(20)
->and($user->credits()->count())->toBe(1);
});
it('announces every change', function () {
Event::fake([CreditsModified::class]);
$user = User::factory()->create();
$user->modifyCredits(10, 'welcome');
Event::assertDispatched(
CreditsModified::class,
fn (CreditsModified $event) => $event->balance === 10 && $event->creditable->is($user),
);
});Zostatky k dátumu
Historické zostatky určuje created_at, takže vám stačí cestovanie v čase z Laravelu:
it('reconstructs a past balance', function () {
$user = User::factory()->create();
$this->travelTo(now()->subWeek());
$user->modifyCredits(100);
$this->travelBack();
$user->modifyCredits(-40);
expect($user->creditsBalance(now()->subDays(3)))->toBe(100)
->and($user->creditsBalance())->toBe(60);
});Factory
Credit obsahuje factory na priame vytvorenie záznamov. K vlastníkovi ho pripojíte cez vzťah creditable:
use RoundlyConsulting\Credits\Models\Credit;
// The factory picks a random amount (-1000..1000) unless you set one.
Credit::factory()->for($user, 'creditable')->create(['amount' => 250, 'bucket' => 'promotional']);Záznamy z factory obchádzajú ochranu pred prečerpaním a nespúšťajú CreditsModified — ak test overuje práve toto, použite modifyCredits().
Databázové enginy
SQLite potichu prijme uuid v celočíselnom stĺpci. Ak ste zmenili key_type alebo primary_key_type, spúšťajte aspoň časť testov na engine, na ktorý nasadzujete.
Testy samotného balíka
Testy balíka spustíte z jeho repozitára:
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.