Test
Queuety fornisce una classe QueueFake che sostituisce la coda reale con un archivio in memoria. I job inviati vengono registrati invece di essere scritti nel database; anche create_batch() registra in memoria i metadati dei batch. In questo modo potete verificare il comportamento dell'invio senza eseguire worker né scrivere nel database. L'invio tramite nome del gestore risolve comunque il gestore tramite il registro, quindi chiamate prima Queuety::init() per inviare job con gestori specificati come stringhe; le istanze Contracts\Job, chain(), create_batch() e batch() funzionano anche senza.
Configurare il fake
Chiamate Queuety::fake() all'inizio del test. Restituisce un'istanza QueueFake che registra tutti gli invii successivi.
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() crea un nuovo QueueFake e lo collega alla facade Queuety. Queuety::dispatch() e Dispatchable::dispatch() registrano i job inseriti. Queuety::chain() registra ciascun job concatenato come un normale inserimento, nell'ordine di invio. Queuety::create_batch() registra sia i job inseriti sia i metadati del batch usati da assert_batched(). Queuety::batch() registra i job inseriti, ma non crea metadati del batch simulati.
Chiamate Queuety::reset() in tearDown() per azzerare il fake tra un test e l'altro. Azzera tutto lo stato della facade; se un test successivo ha bisogno della coda reale, chiamate di nuovo Queuety::init().
Verificare l'inserimento dei job
assert_pushed()
Verificate che una specifica classe di job sia stata inviata almeno una volta.
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 );
}
Passate una callback facoltativa per filtrare per payload o altri attributi. La callback riceve l'array di dati del job registrato con le chiavi handler, payload, queue e instance. instance è null per i job inviati tramite facade o trait Dispatchable, quindi filtrate usando handler e payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Verificate che un job sia stato inserito un numero esatto di volte.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Verificate che un job non sia mai stato inviato.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Verificate che non sia stato inviato alcun 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();
}
Verificare i batch
assert_batched()
Verificate che sia stato inviato un batch. Potete passare una callback facoltativa per filtrare in base al contenuto del batch.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
La callback riceve un array con le chiavi jobs e options.
Esaminare i job inseriti
Usate pushed() per recuperare tutti gli invii registrati per una determinata classe e batches() per recuperare tutti i batch registrati.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Reimpostare tra i test
Chiamate reset() sul fake per cancellare tutti i job e i batch registrati senza creare una nuova istanza.
$this->fake->reset();
Oppure chiamate Queuety::reset() per smantellare completamente il fake e tutto lo stato interno.
Esempio completo
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();
}
}