Tesztelés
A Queuety egy QueueFake osztályt biztosít, amely memóriabeli tárolóval helyettesíti a valódi sort. A kiosztott feladatokat adatbázisba írás helyett rögzíti, a create_batch() pedig a kötegek metaadatait is memóriában tárolja. Így ellenőrizheted a kiosztás viselkedését workerek futtatása vagy adatbázisba írás nélkül. A kezelő neve alapján történő kiosztás továbbra is a regisztrációs adatbázisból oldja fel a kezelőt, ezért karakterláncos kezelőkiosztás esetén először hívd meg a Queuety::init() metódust; a Contracts\Job példányai, a chain(), a create_batch() és a batch() enélkül is működnek.
A hamis sor beállítása
Hívd meg a Queuety::fake() metódust a teszt elején. Egy QueueFake példányt ad vissza, amely rögzíti az összes ezt követő kiosztást.
use Queuety\Queuety;
class SendEmailTest extends \PHPUnit\Framework\TestCase {
protected function setUp(): void {
$this->fake = Queuety::fake();
}
protected function tearDown(): void {
Queuety::reset();
}
}
A Queuety::fake() létrehoz egy új QueueFake példányt, és beköti a Queuety homlokzatába. A Queuety::dispatch() és a Dispatchable::dispatch() rögzíti a sorba állított feladatokat. A Queuety::chain() a lánc minden feladatát normál sorba állításként rögzíti, a kiosztási sorrendben. A Queuety::create_batch() a sorba állított feladatokat és a assert_batched() által használt kötegmetaadatokat is rögzíti. A Queuety::batch() rögzíti a sorba állított feladatokat, de nem hoz létre hamis kötegmetaadatokat.
Hívd meg a Queuety::reset() metódust a tearDown() helyen, hogy a tesztek között töröld a hamis sort. Az összes homlokzati állapotot törli, ezért ha egy későbbi tesztnek a valódi sorra van szüksége, hívd meg ismét a Queuety::init() metódust.
Sorba állított feladatok ellenőrzése
assert_pushed()
Ellenőrizd, hogy egy adott feladatosztályt legalább egyszer kiosztottak-e.
public function test_welcome_email_is_sent(): void {
$this->fake = Queuety::fake();
// Code under test...
register_new_user( 'user@example.com' );
$this->fake->assert_pushed( SendWelcomeEmailJob::class );
}
Opcionálisan adj át egy visszahívást, amellyel a payload vagy más attribútumok alapján szűrhetsz. A visszahívás a rögzített feladatadatok tömbjét kapja, amelynek kulcsai: handler, payload, queue és instance. A instance értéke null a homlokzaton vagy a Dispatchable traiten keresztül kiosztott feladatoknál, ezért a handler és a payload alapján szűrj.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Ellenőrizd, hogy egy feladat pontosan meghatározott számú alkalommal került-e sorba.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Ellenőrizd, hogy egy feladatot soha nem osztottak-e ki.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Ellenőrizd, hogy egyáltalán nem osztottak-e ki feladatot.
public function test_no_jobs_on_invalid_input(): void {
$this->fake = Queuety::fake();
process_input( '' ); // invalid, should not dispatch anything
$this->fake->assert_nothing_pushed();
}
Kötegek ellenőrzése
assert_batched()
Ellenőrizd, hogy kiosztottak-e egy köteget. Opcionálisan visszahívást is átadhatsz a kötegtartalom szerinti szűréshez.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
A visszahívás egy tömböt kap, amelynek kulcsai: jobs és options.
Sorba állított feladatok vizsgálata
A pushed() metódussal lekérheted egy adott osztály összes rögzített kiosztását, a batches() metódussal pedig az összes rögzített köteget.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Visszaállítás a tesztek között
Hívd meg a reset() metódust a hamis soron az összes rögzített feladat és köteg törléséhez, új példány létrehozása nélkül.
$this->fake->reset();
Vagy hívd meg a Queuety::reset() metódust a hamis sor és minden belső állapot teljes lebontásához.
Teljes példa
use PHPUnit\Framework\TestCase;
use Queuety\Queuety;
class OrderWorkflowTest extends TestCase {
private \Queuety\Testing\QueueFake $fake;
protected function setUp(): void {
$this->fake = Queuety::fake();
}
protected function tearDown(): void {
Queuety::reset();
}
public function test_order_dispatches_payment_job(): void {
$order = create_order( [ 'total' => 99.99 ] );
$this->fake->assert_pushed( ProcessPaymentJob::class, function ( array $job ) use ( $order ) {
return $job['payload']['order_id'] === $order->id;
} );
$this->fake->assert_not_pushed( RefundJob::class );
}
public function test_bulk_import_dispatches_batch(): void {
start_bulk_import( $rows );
$this->fake->assert_batched( function ( array $batch ) use ( $rows ) {
return count( $batch['jobs'] ) === count( $rows );
} );
}
public function test_nothing_dispatched_without_data(): void {
process_empty_queue();
$this->fake->assert_nothing_pushed();
}
}