Testare
Queuety oferă o clasă QueueFake care înlocuiește coada reală cu un spațiu de stocare în memorie. Joburile trimise sunt înregistrate în loc să fie scrise în baza de date, iar create_batch() înregistrează tot în memorie și metadatele loturilor. Astfel, puteți verifica comportamentul de trimitere fără a rula workeri sau a scrie în baza de date. Trimiterea folosind numele handlerului continuă să îl rezolve prin registru, așa că apelați mai întâi Queuety::init() pentru joburile trimise cu un handler sub formă de șir; instanțele Contracts\Job, chain(), create_batch() și batch() funcționează fără acest apel.
Configurarea simulării
Apelați Queuety::fake() la începutul testului. Returnează o instanță QueueFake care înregistrează toate trimiterile ulterioare.
use Queuety\Queuety;
class SendEmailTest extends \PHPUnit\Framework\TestCase {
protected function setUp(): void {
$this->fake = Queuety::fake();
}
protected function tearDown(): void {
Queuety::reset();
}
}
Queuety::fake() creează un nou QueueFake și îl conectează la fațada Queuety. Queuety::dispatch() și Dispatchable::dispatch() înregistrează joburile adăugate în coadă. Queuety::chain() înregistrează fiecare job înlănțuit ca pe o adăugare obișnuită, în ordinea trimiterii. Queuety::create_batch() înregistrează atât joburile adăugate, cât și metadatele loturilor folosite de assert_batched(). Queuety::batch() înregistrează joburile adăugate, dar nu creează metadate simulate pentru loturi.
Apelați Queuety::reset() în tearDown() pentru a goli simularea între teste. Aceasta golește întreaga stare a fațadei, așa că apelați din nou Queuety::init() dacă un test ulterior are nevoie de coada reală.
Verificarea adăugării joburilor în coadă
assert_pushed()
Verificați dacă un anumit tip de job a fost trimis cel puțin o dată.
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 );
}
Puteți transmite un callback opțional pentru a filtra după payload sau alte atribute. Callbackul primește tabloul de date al jobului înregistrat, cu cheile handler, payload, queue și instance. Pentru joburile trimise prin fațadă sau traitul Dispatchable, instance este null; prin urmare, filtrați după handler și payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Verificați dacă un job a fost adăugat în coadă de un număr exact de ori.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Verificați dacă un job nu a fost trimis niciodată.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Verificați dacă nu a fost trimis niciun job.
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();
}
Verificarea loturilor
assert_batched()
Verificați dacă a fost trimis un lot. Puteți transmite un callback opțional pentru a filtra după conținutul lotului.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
Callbackul primește un tablou cu cheile jobs și options.
Inspectarea joburilor adăugate în coadă
Folosiți pushed() pentru a prelua toate joburile trimise înregistrate pentru o anumită clasă și batches() pentru a prelua toate loturile înregistrate.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Resetarea între teste
Apelați reset() pe simulare pentru a șterge toate joburile și loturile înregistrate, fără a crea o instanță nouă.
$this->fake->reset();
Sau apelați Queuety::reset() pentru a dezactiva complet simularea și a șterge întreaga stare internă.
Exemplu complet
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();
}
}