Gå til indhold

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.

PHP
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.

PHP
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.

PHP
$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.

PHP
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );

assert_not_pushed()

Kontrollér, at et job aldrig blev afsendt.

PHP
$this->fake->assert_not_pushed( DeleteAccountJob::class );

assert_nothing_pushed()

Kontrollér, at der slet ikke blev afsendt nogen jobs.

PHP
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.

PHP
$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.

PHP
$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.

PHP
$this->fake->reset();

Eller kald Queuety::reset() for at nedlægge den falske kø fuldstændigt og rydde al intern tilstand.

Fuldt eksempel

PHP
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();
    }
}