Testovanie, či bol príkaz skutočne naplánovaný, môže byť kontroverzná otázka. Mali by sme testovať, či plánovač funguje a spúšťa úlohy včas? Samozrejme nie, to je poskytnuté frameworkom a dokonca vidíme, že testy sú prítomné a integrujú sa navzájom.
Existuje však časť aplikácie, ktorú otestovať možno, a to, či je príkaz, ktorý očakávame, zaraďovaný do plánovača. Našiel som pekné riešenie a upravil ho pre Laravel 8:
<?php
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Console\Scheduling\Event;
public function testIsAvailableInTheScheduler()
{
$schedule = app()->make(Schedule::class);
$events = collect($schedule->events())->filter(function (Event $event) {
return stripos($event->description, 'PruneLogs');
});
if ($events->count() == 0) {
$this->fail('No events found');
}
$events->each(function (Event $event) {
// Every minute
$this->assertEquals('* * * * *', $event->expression);
});
}
Musíme tiež skutočne
definovať
naplánovaný príkaz v triede App\Console\Kernel:
<?php
protected function schedule(Schedule $schedule) {
$schedule->call(new PruneLogs)->everyMinute();
}
Napríklad, vyššie uvedené zavolá
invokable objekt
s názvom PruneLogs každú minútu, čo spôsobí, že vyššie uvedený test
prejde. Jobs sa môžu používať rovnakým spôsobom, jednoducho nahradením
call za job.
Riešenie som našiel cez Tinker, vlastnosť command bola null, ale
description bolo to, čo som hľadal:
>>> app()->make(\Illuminate\Console\Scheduling\Schedule::class)->events();
=> [
Illuminate\Console\Scheduling\CallbackEvent {#3496
+command: null,
+expression: "* * * * *",
+timezone: "UTC",
+user: null,
+environments: [],
+evenInMaintenanceMode: false,
+withoutOverlapping: false,
+onOneServer: false,
+expiresAt: 1440,
+runInBackground: false,
+output: "/dev/null",
+shouldAppendOutput: false,
+description: "App\Jobs\GenerateSuggestion",
+mutex: Illuminate\Console\Scheduling\CacheEventMutex {#3498
+cache: Illuminate\Cache\CacheManager {#282},
+store: null,
},
+exitCode: null,
},
]
Dúfam, že to pomôže!