---
title: "Testovanie — Advertisements for Laravel | Roundly"
description: "Advertisements::fake() zaznamená každý prechod, zmenu umiestnení aj meranie s assertom pre každé, plus továrne a simulácia geolokácie."
url: https://roundly-consulting.com/sk/open-source/navody/advertisements-for-laravel/testovanie
language: sk
---

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

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

# Testovanie

Advertisements::fake() nainštaluje RoundlyConsulting\\Advertisements\\Testing\\AdvertisementsFake — podtyp AdvertisementManager — za fasádu aj do kontajnera, takže ho zasiahnu aj manažéry injektované cez konštruktor a metódy modelu ($ad->publish(), $ad->delete(), …). Vráti fake ako handle pre asserty:

```php
use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Advertisements\Models\Placement;
use RoundlyConsulting\Advertisements\Testing\RecordedEvent;
use RoundlyConsulting\Advertisements\Testing\RecordedPlacements;

it('launches an ad in the sidebar and counts an impression', function () {
    $fake = Advertisements::fake();
    Placement::factory()->create(['slug' => 'sidebar']);
    $ad = Advertisement::factory()->create();

    Advertisements::for($ad)->placements()->attach(['sidebar']); // still runs: track() needs it
    $ad->publish();                                              // model sugar — recorded too
    Advertisements::for($ad)->track('sidebar')->impression();    // in memory only, returns null

    $fake->assertPlacementsAttached(fn (RecordedPlacements $c) => $c->includes('sidebar'));
    $fake->assertPublished($ad);
    $fake->assertImpressionRecorded(fn (RecordedEvent $e) => $e->ad->is($ad) && $e->placement === 'sidebar');
    $fake->assertNothingDeleted();
});

it('tracks nothing for a page without ads', function () {
    $fake = Advertisements::fake();

    // … render a page without placements …

    $fake->assertNothingRecorded();
});
```

- Zmeny životného cyklu a umiestnení stále bežia nad databázou — čítanie aj udalosti sa správajú bežne — a zároveň sa zaznamenajú.
- Meranie sa zaznamená len v pamäti — žiadny riadok, počítadlo ani job — a vráti null. Kontrola živej reklamy aj umiestnenia v track() stále platí, preto reklamu pred meraním zverejnite a umiestnenie priraďte.
- Opakované volanie fake() vráti už nainštalovaný fake.
- Fake nahrádza manažéra, nie akcie — trieda akcie, ktorú si vyžiadate priamo (RecordImpression), riadky stále zapisuje.

## Všetky asserty

| Zaznamenáva | Assert | Negatívny assert |
| --- | --- | --- |
| `create` | `assertCreated(…)` | `assertNothingCreated()` |
| `update` | `assertUpdated(…)` | `assertNothingUpdated()` |
| `publish / $ad->publish()` | `assertPublished(…)` | `assertNothingPublished()` |
| `unpublish / $ad->unpublish()` | `assertUnpublished(…)` | `assertNothingUnpublished()` |
| `expire / $ad->expire()` | `assertExpired(…)` | `assertNothingExpired()` |
| `archive / $ad->archive()` | `assertArchived(…)` | `assertNothingArchived()` |
| `delete / $ad->delete()` | `assertDeleted(…)` | `assertNothingDeleted()` |
| `for($ad)->placements()->attach()` | `assertPlacementsAttached(…)` | `assertNothingAttached()` |
| `for($ad)->placements()->detach()` | `assertPlacementsDetached(…)` | `assertNothingDetached()` |
| `for($ad)->placements()->sync()` | `assertPlacementsSynced(…)` | `assertNothingSynced()` |
| `for($ad)->track()->impression()` | `assertImpressionRecorded(…)` | `assertNothingRecorded()` |
| `for($ad)->track()->click()` | `assertClickRecorded(…)` | `assertNothingRecorded()` |

Každý assert prijíma Advertisement, Closure alebo nič. Closure pri životnom cykle dostane Advertisement, pri umiestneniach RecordedPlacements (ad, umiestnenia tak, ako boli zadané, a includes($placement), ktoré porovnáva podľa modelu, id aj slugu) a pri meraní RecordedEvent (ad, type, zadané placement a data):

```php
// Lifecycle — each takes an Advertisement, a Closure(Advertisement) or nothing
$fake->assertCreated(fn (Advertisement $ad) => $ad->name === 'Vintage road bike');
$fake->assertUpdated($ad);
$fake->assertPublished($ad);
$fake->assertUnpublished($ad);
$fake->assertExpired($ad);
$fake->assertArchived($ad);
$fake->assertDeleted($ad);
$fake->assertNothingCreated();      // … and assertNothingUpdated / Published / Unpublished /
$fake->assertNothingArchived();     //     Expired / Archived / Deleted

// Placements — an Advertisement, a Closure(RecordedPlacements) or nothing
$fake->assertPlacementsAttached(fn (RecordedPlacements $c) => $c->includes('sidebar'));
$fake->assertPlacementsDetached($ad);
$fake->assertPlacementsSynced($ad);
$fake->assertNothingAttached();
$fake->assertNothingDetached();
$fake->assertNothingSynced();

// Tracking — an Advertisement, a Closure(RecordedEvent) or nothing
$fake->assertImpressionRecorded(fn (RecordedEvent $e) => $e->placement === 'sidebar');
$fake->assertClickRecorded($ad);
$fake->assertNothingRecorded();     // no impression and no click
```

## Továrne

Na testovanie a seedovanie sú pripravené továrne. Továreň reklám má stavy published(), scheduled(), expired() a archived(), továreň udalostí stavy impression() a click():

```php
use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Advertisements\Models\AdvertisementEvent;
use RoundlyConsulting\Advertisements\Models\Category;
use RoundlyConsulting\Advertisements\Models\Placement;

Advertisement::factory()->create();              // a draft with a random EUR price
Advertisement::factory()->published()->create();
Advertisement::factory()->scheduled()->create();
Advertisement::factory()->expired()->create();
Advertisement::factory()->archived()->create();

Placement::factory()->create(['slug' => 'sidebar', 'width' => 300, 'height' => 250]);
Category::factory()->create(['slug' => 'vehicles', 'name' => ['en' => 'Vehicles']]);

AdvertisementEvent::factory()->impression()->create(['advertisement_id' => $ad->id]);
AdvertisementEvent::factory()->click()->create(['advertisement_id' => $ad->id]);
```

Riadky z továrne udalostí nezvyšujú počítadlá reklamy — ak test potrebuje impressions\_count alebo clicks\_count, merajte cez Advertisements::for($ad)->track() bez fake.

## Simulácia geolokácie

Falošnú implementáciu geolocation-for-laravel naplňte pripravenými polohami — bez HTTP a bez poskytovateľa:

```php
use RoundlyConsulting\Advertisements\DataTransferObjects\ImpressionData;
use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Advertisements\Models\Advertisement;
use RoundlyConsulting\Geolocation\DataTransferObjects\Location;
use RoundlyConsulting\Geolocation\Enum\GeolocationType;
use RoundlyConsulting\Geolocation\Facades\Geolocation;

it('reports impressions per country', function () {
    Geolocation::fake([
        '203.0.113.7' => new Location(
            humanReadable: 'Bratislava SK',
            street: '',
            city: 'Bratislava',
            countryIsoCode: 'SK',
            latitude: 48.1486,
            longitude: 17.1077,
            type: GeolocationType::Ip,
        ),
    ]);

    $ad = Advertisement::factory()->published()->create();

    Advertisements::for($ad)->track()->impression(new ImpressionData(ip: '203.0.113.7'));

    expect($ad->impressionsByCountry())->toBe(['SK' => 1]);
});
```

## Udalosti životného cyklu

```php
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Advertisements\Events\AdvertisementPublished;
use RoundlyConsulting\Advertisements\Facades\Advertisements;
use RoundlyConsulting\Advertisements\Models\Advertisement;

it('announces a publish', function () {
    Event::fake([AdvertisementPublished::class]);

    $ad = Advertisement::factory()->create();
    Advertisements::publish($ad);

    Event::assertDispatched(AdvertisementPublished::class, fn ($e) => $e->advertisement->is($ad));
    expect($ad->isPublished())->toBeTrue();
});
```

V testovacej databáze spúšťajte publikované migrácie (RefreshDatabase) — vždy, keď test vykresľuje reklamu, aj migrácie media-library, a pri testovaní kreatív aj Storage::fake() s UploadedFile::fake()->image().

## 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/advertisements-for-laravel.md)
