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:
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):
// 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 clickTová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():
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:
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
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 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.