Test
Queuety leverer en QueueFake-klasse, der erstatter den rigtige kø med et lager i hukommelsen. Afsendte jobs registreres i stedet for at blive skrevet til databasen, og create_batch() registrerer også batchmetadata i hukommelsen. Dermed kan du kontrollere afsendelsesadfærd uden at køre workers eller skrive til databasen. Ved afsendelse efter handlernavn slås handleren stadig op i registret, så kald Queuety::init() først ved afsendelse med streng-handlernavne; Contracts\Job-instanser, chain(), create_batch() og batch() fungerer uden.
Opsætning af den falske kø
Kald Queuety::fake() i starten af din test. Den returnerer en QueueFake-instans, som registrerer alle efterfølgende afsendelser.
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() opretter en ny QueueFake og kobler den til Queuety-facaden. Queuety::dispatch() og Dispatchable::dispatch() registrerer jobs, der lægges i køen. Queuety::chain() registrerer hvert kædet job som en almindelig køtilføjelse i afsendelsesrækkefølgen. Queuety::create_batch() registrerer både de jobs, der lægges i køen, og batchmetadataene, som bruges af assert_batched(). Queuety::batch() registrerer jobs, der lægges i køen, men opretter ikke falske batchmetadata.
Kald Queuety::reset() i tearDown() for at rydde den falske kø mellem tests. Den rydder al facadetilstand, så kald Queuety::init() igen, hvis en senere test har brug for den rigtige kø.
Kontrollér, at jobs blev lagt i køen
assert_pushed()
Kontrollér, at en bestemt jobklasse blev afsendt mindst én gang.
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 );
}
Angiv en valgfri callback for at filtrere efter nyttelast eller andre attributter. Callbacken modtager det registrerede jobdata-array med nøglerne handler, payload, queue og instance. instance er null for jobs, der er afsendt via facaden eller traitet Dispatchable, så filtrér efter handler og payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Kontrollér, at et job blev lagt i køen et bestemt antal gange.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Kontrollér, at et job aldrig blev afsendt.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Kontrollér, at der slet ikke blev afsendt nogen jobs.
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();
}
Kontrollér batches
assert_batched()
Kontrollér, at en batch blev afsendt. Angiv eventuelt en callback for at filtrere efter batchens indhold.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
Callbacken modtager et array med nøglerne jobs og options.
Undersøg jobs, der er lagt i køen
Brug pushed() til at hente alle registrerede afsendelser for en given klasse, og batches() til at hente alle registrerede batches.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Nulstil mellem tests
Kald reset() på den falske kø for at rydde alle registrerede jobs og batches uden at oprette en ny instans.
$this->fake->reset();
Eller kald Queuety::reset() for at nedlægge den falske kø fuldstændigt og rydde al intern tilstand.
Fuldt eksempel
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();
}
}