Testning
Queuety tillhandahåller en QueueFake-klass som ersätter den riktiga kön med ett minnesbaserat lager. Skickade jobb registreras i stället för att skrivas till databasen, och create_batch() registrerar också batchmetadata i minnet. På så sätt kan du verifiera beteendet när jobb skickas iväg utan att köra arbetare eller skriva till databasen. När jobb skickas iväg med handläggarnamn slås handläggaren fortfarande upp i registret, så anropa Queuety::init() först när du skickar iväg jobb med strängbaserade handläggare. Instanser av Contracts\Job, chain(), create_batch() och batch() fungerar utan det.
Konfigurera simuleringen
Anropa Queuety::fake() i början av testet. Den returnerar en QueueFake-instans som registrerar alla efterföljande jobb som skickas iväg.
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() skapar en ny QueueFake och kopplar in den i fasaden Queuety. Queuety::dispatch() och Dispatchable::dispatch() registrerar jobb som läggs i kön. Queuety::chain() registrerar varje jobb i en kedja som ett vanligt köat jobb i den ordning de skickas iväg. Queuety::create_batch() registrerar både köade jobb och batchmetadata som används av assert_batched(). Queuety::batch() registrerar de köade jobben, men skapar inte simulerade batchmetadata.
Anropa Queuety::reset() i tearDown() för att rensa simuleringen mellan tester. Den rensar hela fasadens tillstånd, så anropa Queuety::init() igen om ett senare test behöver den riktiga kön.
Kontrollera att jobb har lagts i kön
assert_pushed()
Kontrollera att jobb av en viss klass har skickats iväg minst en gång.
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 );
}
Du kan skicka med en valfri återanropsfunktion för att filtrera efter nyttolast eller andra attribut. Funktionen får den registrerade jobbdatans array med nycklarna handler, payload, queue och instance. Värdet för instance är null för jobb som skickats via fasaden eller egenskapen Dispatchable, så filtrera på handler och payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Kontrollera att ett jobb har lagts i kön exakt ett visst antal gånger.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Kontrollera att ett jobb aldrig har skickats iväg.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Kontrollera att inga jobb alls har skickats iväg.
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();
}
Kontrollera batchar
assert_batched()
Kontrollera att en batch har skickats iväg. Du kan också skicka med en återanropsfunktion för att filtrera efter batchinnehåll.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
Återanropsfunktionen får en array med nycklarna jobs och options.
Granska köade jobb
Använd pushed() för att hämta alla registrerade jobb som skickats iväg för en viss klass och batches() för att hämta alla registrerade batchar.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Återställ mellan tester
Anropa reset() på simuleringen för att rensa alla registrerade jobb och batchar utan att skapa en ny instans.
$this->fake->reset();
Du kan också anropa Queuety::reset() för att helt avveckla simuleringen och allt internt tillstånd.
Fullständigt exempel
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();
}
}