---
title: "Testovanie — Plausible for Laravel | Roundly"
description: "Nahraďte klienta nahrávacím Plausible::fake() — bez reálneho HTTP — a overujte udalosti, dotazy aj správu webov."
url: https://roundly-consulting.com/sk/open-source/navody/plausible-for-laravel/testovanie
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Plausible for Laravel](https://roundly-consulting.com/sk/open-source/navody/plausible-for-laravel.md)

# Testovanie

V testoch aplikácie nahraďte klienta nahrávacím fake cez Plausible::fake() — bez reálneho HTTP. Vráti PlausibleFake, podtyp PlausibleManager, a nainštaluje ho za fasádu aj do kontajnera, takže sa zaznamená injektovaný PlausibleManager, plausible(), trait Trackable aj middleware plausible.track. Potom overte, čo sa zaznamenalo alebo dotazovalo — na fasáde alebo na vrátenom objekte:

```php
use RoundlyConsulting\Money\Money;
use RoundlyConsulting\Plausible\Facades\Plausible;
use RoundlyConsulting\Plausible\Requests\Events\CaptureEventRequest;

it('tracks the purchase', function () {
    Plausible::fake();

    $this->post('/checkout', [/* ... */]);

    Plausible::assertEventCaptured(
        fn (CaptureEventRequest $event) => $event->name === 'purchase'
            && $event->revenue?->amount->equals(Money::ofMajor('49', 'EUR')) === true,
    );
    Plausible::assertEventCapturedCount(1);
});

it('reads the dashboard numbers', function () {
    Plausible::fake();

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

    Plausible::assertQueried(fn ($request, string $type) => $type === 'aggregate');
});
```

Nahráva sa aj správa webov. Vytvorenie a zmazanie webu a zmazanie cieľa nič neodošlú a odpovedia pripravenými typovanými výsledkami:

```php
it('provisions analytics for a new tenant', function () {
    Plausible::fake();

    $this->post('/tenants', ['domain' => 'new-tenant.com']);

    Plausible::assertSiteCreated('new-tenant.com');
    Plausible::assertGoalCreated('new-tenant.com');
    Plausible::assertSharedLinkCreated('new-tenant.com');
    Plausible::assertNothingCaptured();
});

it('offboards a tenant', function () {
    $fake = Plausible::fake();   // PlausibleFake — asserts work on the handle too

    $this->delete('/tenants/old-tenant.com');

    $fake->assertSiteDeleted('old-tenant.com');
    $fake->assertGoalDeleted('old-tenant.com', 42);
    $fake->assertSiteNotUpdated();
});
```

## Asercie

| Asercia | Prejde, keď |
| --- | --- |
| `assertEventCaptured(?callable)` | Bola zaznamenaná akákoľvek udalosť, prípadne udalosť vyhovujúca callbacku. |
| `assertEventNotCaptured(?callable)` | Nebola zaznamenaná žiadna udalosť, prípadne žiadna nevyhovuje callbacku. |
| `assertNothingCaptured()` | Nebola zaznamenaná vôbec žiadna udalosť. |
| `assertEventCapturedCount(int)` | Bol zaznamenaný presne daný počet udalostí. |
| `assertQueried(?callable)` | Prebehol akýkoľvek dotaz na štatistiky, prípadne dotaz vyhovujúci fn ($request, string $type). |
| `assertNothingQueried()` | Neprebehol žiadny dotaz na štatistiky. |
| `assertSiteCreated(?string)` | Bol vytvorený akýkoľvek web, prípadne web s danou doménou. |
| `assertSiteNotCreated(?string)` | Nebol vytvorený žiadny web, prípadne web s danou doménou. |
| `assertSiteUpdated(string)` | Bol upravený web s danou aktuálnou doménou. |
| `assertSiteNotUpdated(?string)` | Nebol upravený žiadny web, prípadne daný web. |
| `assertSiteDeleted(string)` | Daný web bol zmazaný. |
| `assertSiteNotDeleted(?string)` | Nebol zmazaný žiadny web, prípadne daný web. |
| `assertGoalCreated(?string)` | Bol vytvorený akýkoľvek cieľ, prípadne cieľ pre daný web. |
| `assertGoalNotCreated(?string)` | Nebol vytvorený žiadny cieľ, prípadne žiadny pre daný web. |
| `assertGoalDeleted(string, int\|string)` | Daný cieľ bol z daného webu zmazaný. |
| `assertGoalNotDeleted(?string, int\|string\|null)` | Nebol zmazaný žiadny cieľ zodpovedajúci webu a id — oba sú voliteľné. |
| `assertSharedLinkCreated(?string)` | Bol vytvorený akýkoľvek zdieľaný odkaz, prípadne odkaz pre daný web. |
| `assertSharedLinkNotCreated(?string)` | Nebol vytvorený žiadny zdieľaný odkaz, prípadne žiadny pre daný web. |

Každá pozitívna asercia má negatívne dvojča:

```php
Plausible::assertEventNotCaptured(fn (CaptureEventRequest $event) => $event->name === 'refund');
Plausible::assertNothingCaptured();
Plausible::assertNothingQueried();
Plausible::assertSiteNotCreated('staging.my-site.com');
Plausible::assertSiteNotDeleted();          // no site deleted at all
Plausible::assertSiteNotUpdated('my-site.com');
Plausible::assertGoalNotCreated();
Plausible::assertGoalNotDeleted('my-site.com');   // site and goal id are both optional
Plausible::assertSharedLinkNotCreated();
```

## Ako sa fake správa

- Iba zaznamenáva — do Plausible sa nedostane nič. HTTP pre nakonfigurovanú url je podvrhnuté (prázdne url či key doplní testovacími hodnotami) a každé volanie dostane prázdny výsledok, takže štatistiky vrátia nulové metriky a žiadne riadky.
- captureQueued() udalosť zaznamená namiesto odoslania úlohy, worker fronty teda netreba — rovnako ako skutočný klient však vyžaduje návštevníka (setVisitor() alebo fromRequest()), takže test neprejde pre kód, ktorý by v produkcii zlyhal.
- capture() — a tiež pageview(), event() a captureMany() — zaznamená udalosť až po odchode podvrhnutej požiadavky, takže zaznamenanie bez návštevníka alebo s neúspešnou požiadavkou vyhodí výnimku ako v produkcii a nezaznamená nič.
- captureManyQueued() zaznamená každú udalosť a potom dávku naozaj odošle (vracia Batch), preto ho kombinujte s Bus::fake() — inak potrebuje tabuľku job\_batches a úlohy spustí vo vašej fronte.
- Klientske obmedzenie požiadaviek je vypnuté, takže žiadne volanie sa nespomalí ani neuspí, nech test zriadi akokoľvek veľa webov, cieľov či zdieľaných odkazov.
- Middleware aj trait Trackable získavajú klienta cez plausible(), takže sa zaznamenajú aj ich udalosti.
- Callback v assertQueried() dostane objekt požiadavky a jej typ: realtime, aggregate, timeseries, breakdown alebo query.

## Hromadné importy cez frontu

```php
use Illuminate\Bus\PendingBatch;
use Illuminate\Support\Facades\Bus;

it('imports historical events', function () {
    Plausible::fake();
    Bus::fake();   // captureManyQueued() still dispatches its batch, even under the fake

    $this->artisan('analytics:import')->assertSuccessful();

    Plausible::assertEventCaptured(fn (CaptureEventRequest $event) => $event->name === 'import');
    Bus::assertBatched(fn (PendingBatch $batch) => $batch->name === 'plausible:capture');
});
```

## Overovanie fronty

Bez fake overíte udalosti vo fronte cez Queue::fake() z Laravelu — CaptureEventJob sprístupňuje request, userAgent a ipAddress:

```php
use Illuminate\Support\Facades\Queue;
use RoundlyConsulting\Plausible\Jobs\CaptureEventJob;

it('queues an Order Placed event', function () {
    config()->set('plausible.site', 'my-site.com');
    Queue::fake();

    Order::create(['total' => 99]);

    Queue::assertPushed(
        CaptureEventJob::class,
        fn (CaptureEventJob $job) => $job->request->name === 'Order Placed'
            && $job->request->site === 'my-site.com',
    );
});
```

Vlastné testy balíka spustíte príkazom:

```bash
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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/plausible-for-laravel.md)
