Testovanie
Appointments::fake() podstrčí zaznamenávajúci AppointmentsFake — za fasádu aj do kontajnera, takže fake dostane aj injektovaný AppointmentManager — a vráti ho. Operácie naďalej bežia nad databázou: kontroly dostupnosti, čítanie cez participants() aj eventy balíka fungujú ďalej. Zaznamená sa každý zápis, či prišiel cez fasádu, injektovaný manažér, builder, handle for() alebo skratku na modeli, napríklad $appointment->cancel():
use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Appointments\Models\Appointment;
$fake = Appointments::fake();
$this->post('/bookings', [...]);
$fake->assertScheduled(fn (Appointment $appointment) => $appointment->name === 'Consultation');
$fake->assertTransitioned(fn (Appointment $appointment, Status $to, Status $from) => $to === Status::Cancelled);
$fake->assertRescheduled(fn (Appointment $appointment, $previousStartsAt) => true);
$fake->assertParticipantAdded(fn (Appointment $appointment, $participant, $row) => $participant->is($user));
$fake->assertParticipantRemoved(fn (Appointment $appointment, $participant) => $participant->is($user));
$fake->assertNothingScheduled();
$fake->assertNothingRescheduled();
$fake->assertNothingTransitioned();
$fake->assertNoParticipantAdded();
$fake->assertNoParticipantRemoved();Všetky asercie
| Asercia | Callback dostane | Zaznamená ju |
|---|---|---|
assertScheduled(?Closure) · assertNothingScheduled() | Appointment | create(), schedule()->create(), createRecurring() — jeden záznam na výskyt. |
assertRescheduled(?Closure) · assertNothingRescheduled() | Appointment, CarbonImmutable $previousStartsAt | for()->reschedule(). |
assertTransitioned(?Closure) · assertNothingTransitioned() | Appointment, Status $to, Status $from | for()->transition() a jej skratky, plus confirm(), cancel(), complete(), decline(), markNoShow() a transitionTo() na modeli. |
assertParticipantAdded(?Closure) · assertNoParticipantAdded() | Appointment, Model $participant, Participant $row | for()->participants()->add(). |
assertParticipantRemoved(?Closure) · assertNoParticipantRemoved() | Appointment, Model $participant — odobraný riadok sa zaznamená ako jeho model | for()->participants()->remove(). |
- Každý callback je voliteľný — bez neho asercia prejde, ak sa zaznamenalo čokoľvek daného druhu.
- Každá asercia funguje aj staticky na fasáde, napríklad Appointments::assertScheduled().
- Účastníci uvedení pri novom termíne patria k jeho naplánovaniu; ako pridaný sa ráta len participants()->add().
- Požiadavka na stav, ktorý termín už má, nič neurobí, preto sa nezaznamená ako prechod.
- Odmietnuté volanie — také, ktoré vyhodí výnimku — sa nezaznamená. Zmeny stavu zo synchronizačného listenera schvaľovania nie sú volaniami hostiteľskej aplikácie, takže sa nezaznamenajú tiež.
- Priamo volané akcie fake obchádzajú.
Appointments::fake();
Appointments::for($appointment)->cancel(); // or $appointment->cancel() — recorded either way
Appointments::assertTransitioned(fn (Appointment $appointment, Status $to) => $to === Status::Cancelled);
Appointments::assertNothingScheduled();Factory modelu
Model Appointment z balíka má factory — čakajúci termín so začiatkom zajtra a trvaním 60 minút — a stav withStatus():
use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Models\Appointment;
$appointment = Appointment::factory()->create(); // pending, starts tomorrow, 60 minutes
$confirmed = Appointment::factory()
->withStatus(Status::Confirmed)
->create(['starts_at' => now()->addWeek()]);Ukážkové testy
Fakujte len eventy, ktoré overujete, a používajte ten istý builder a pomocné metódy ako vaša aplikácia:
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Appointments\Enums\Status;
use RoundlyConsulting\Appointments\Events\AppointmentStatusChanged;
use RoundlyConsulting\Appointments\Exceptions\SchedulingConflictException;
use RoundlyConsulting\Appointments\Facades\Appointments;
use RoundlyConsulting\Appointments\Models\Appointment;
it('confirms a booking and announces it', function () {
Event::fake([AppointmentStatusChanged::class]);
$appointment = Appointment::factory()->create();
Appointments::for($appointment)->confirm();
expect($appointment->status)->toBe(Status::Confirmed);
Event::assertDispatched(
AppointmentStatusChanged::class,
fn (AppointmentStatusChanged $e) => $e->from === Status::Pending && $e->to === Status::Confirmed,
);
});
it('blocks a double booking', function () {
$doctor = User::factory()->create();
Appointments::schedule('First')->startingAt('2026-07-01 09:00')->lasting(60)
->withParticipant($doctor)->create();
expect(fn () => Appointments::schedule('Clash')->startingAt('2026-07-01 09:30')->lasting(60)
->withParticipant($doctor)->preventConflicts()->create()
)->toThrow(SchedulingConflictException::class);
});Testy spúšťajte s načítanými publikovanými migráciami (RefreshDatabase) — tabuľkami termínov aj tabuľkami provider balíkov z Inštalácie.
Vlastná sada testov 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.