Ga naar de inhoud

Testen

Queuety biedt een klasse QueueFake die de echte wachtrij vervangt door een in-memory opslag. Gedispatchte taken worden geregistreerd in plaats van naar de database geschreven, en create_batch() registreert batchmetagegevens eveneens in het geheugen. Zo kunt u het dispatchgedrag controleren zonder workers uit te voeren of naar de database te schrijven. Bij dispatch op basis van een handlernaam wordt de handler nog steeds via het register opgezocht. Roep daarom eerst Queuety::init() aan voor dispatches met een string-handler; instanties van Contracts\Job, chain(), create_batch() en batch() werken zonder die aanroep.

De nepinstantie instellen

Roep Queuety::fake() aan aan het begin van uw test. Deze geeft een instantie van QueueFake terug die alle daaropvolgende dispatches registreert.

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() maakt een nieuwe QueueFake aan en koppelt deze aan de facade Queuety. Queuety::dispatch() en Dispatchable::dispatch() registreren toegevoegde taken. Queuety::chain() registreert elke gekoppelde taak als een gewone toevoeging, in dispatchvolgorde. Queuety::create_batch() registreert zowel de toegevoegde taken als de batchmetagegevens die door assert_batched() worden gebruikt. Queuety::batch() registreert de toegevoegde taken, maar maakt geen nep-batchmetagegevens aan.

Roep Queuety::reset() aan in tearDown() om de nepinstantie tussen tests te wissen. Alle facadestatus wordt gewist, dus roep Queuety::init() opnieuw aan als een latere test de echte wachtrij nodig heeft.

Controleren of taken zijn toegevoegd

assert_pushed()

Controleer of een specifieke taakkklasse minstens één keer is gedispatcht.

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

Geef optioneel een callback mee om te filteren op payload of andere kenmerken. De callback ontvangt de array met geregistreerde taakgegevens met de sleutels handler, payload, queue en instance. Voor taken die via de facade of de trait Dispatchable zijn gedispatcht, is instance null. Filter daarom op handler en payload.

PHP
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
    return $job['payload']['to'] === 'user@example.com';
} );

assert_pushed_times()

Controleer of een taak exact een bepaald aantal keer is toegevoegd.

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

assert_not_pushed()

Controleer of een taak nooit is gedispatcht.

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

assert_nothing_pushed()

Controleer of er helemaal geen taken zijn gedispatcht.

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

Batches controleren

assert_batched()

Controleer of een batch is gedispatcht. Geef optioneel een callback mee om te filteren op de inhoud van de batch.

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

$this->fake->assert_batched( function ( array $batch ) {
    return count( $batch['jobs'] ) === 3;
} );

De callback ontvangt een array met de sleutels jobs en options.

Toegevoegde taken bekijken

Gebruik pushed() om alle geregistreerde dispatches voor een bepaalde klasse op te halen en batches() om alle geregistreerde batches op te halen.

PHP
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]

$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]

Tussen tests opnieuw instellen

Roep reset() aan op de nepinstantie om alle geregistreerde taken en batches te wissen zonder een nieuwe instantie aan te maken.

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

Of roep Queuety::reset() aan om de nepinstantie en alle interne status volledig op te ruimen.

Volledig voorbeeld

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