Pruebas
Queuety proporciona una clase QueueFake que sustituye la cola real por un almacén en memoria. Los trabajos enviados se registran en lugar de guardarse en la base de datos, y create_batch() también registra en memoria los metadatos de lotes. Así puede comprobar el comportamiento de envío sin ejecutar workers ni escribir en la base de datos. Al enviar un trabajo por nombre de handler, este se busca en el registro, así que llame primero a Queuety::init() para envíos con un handler de tipo cadena; las instancias de Contracts\Job, chain(), create_batch() y batch() funcionan sin esa llamada.
Configurar la simulación
Llame a Queuety::fake() al principio de la prueba. Devuelve una instancia de QueueFake que registra todos los envíos posteriores.
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 una nueva instancia de QueueFake y la conecta a la fachada Queuety. Queuety::dispatch() y Dispatchable::dispatch() registran los trabajos enviados. Queuety::chain() registra cada trabajo encadenado como un envío normal, según el orden de envío. Queuety::create_batch() registra tanto los trabajos enviados como los metadatos del lote que utiliza assert_batched(). Queuety::batch() registra los trabajos enviados, pero no crea metadatos de lote simulados.
Llame a Queuety::reset() en tearDown() para limpiar la simulación entre pruebas. Se borra todo el estado de la fachada, así que vuelva a llamar a Queuety::init() si una prueba posterior necesita la cola real.
Comprobar que se enviaron los trabajos
assert_pushed()
Compruebe que se haya enviado al menos una vez un trabajo de una clase específica.
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 );
}
Pase una función de retorno opcional para filtrar por payload u otros atributos. La función recibe la matriz de datos del trabajo registrado con las claves handler, payload, queue y instance. instance es null para los trabajos enviados mediante la fachada o el trait Dispatchable, así que filtre por handler y payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Compruebe que un trabajo se haya enviado un número exacto de veces.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Compruebe que nunca se haya enviado un trabajo.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Compruebe que no se haya enviado ningún trabajo.
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();
}
Comprobar lotes
assert_batched()
Compruebe que se haya enviado un lote. Puede pasar una función de retorno opcional para filtrar por el contenido del lote.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
La función recibe una matriz con las claves jobs y options.
Inspeccionar trabajos enviados
Use pushed() para recuperar todos los envíos registrados de una clase determinada y batches() para recuperar todos los lotes registrados.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Restablecer entre pruebas
Llame a reset() en la simulación para borrar todos los trabajos y lotes registrados sin crear una instancia nueva.
$this->fake->reset();
O llame a Queuety::reset() para deshacer por completo la simulación y todo su estado interno.
Ejemplo 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();
}
}