Liigu sisu juurde

Testimine

Queuety pakub klassi QueueFake, mis asendab päris järjekorra mälusisese salvestiga. Väljastatud tööd salvestatakse jäljena, mitte andmebaasi, ning create_batch() salvestab mällu ka partiide metaandmed. Nii saate väljastamise käitumist kontrollida töötajaid käivitamata ja andmebaasi kirjutamata. Käsitleja nime järgi väljastamisel leitakse käsitleja endiselt registri kaudu, seega kutsuge stringina määratud käsitlejaga väljastamisel esmalt välja Queuety::init(); klassi Contracts\Job eksemplarid, chain(), create_batch() ja batch() toimivad selleta.

Jäljendi seadistamine

Kutsuge testi alguses välja Queuety::fake(). See tagastab eksemplari QueueFake, mis salvestab kõik järgnevad väljastused.

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() loob uue QueueFake ja ühendab selle fassaadiga Queuety. Queuety::dispatch() ja Dispatchable::dispatch() salvestavad lisatud tööd. Queuety::chain() salvestab iga aheldatud töö tavalise lisamisena väljastamise järjekorras. Queuety::create_batch() salvestab nii lisatud tööd kui ka assert_batched()-i kasutatavad partiide metaandmed. Queuety::batch() salvestab lisatud tööd, kuid ei loo võltsitud partiide metaandmeid.

Jäljendi tühjendamiseks testide vahel kutsuge tearDown()-is välja Queuety::reset(). See tühjendab kogu fassaadi oleku, nii et kui mõni hilisem test vajab päris järjekorda, kutsuge uuesti välja Queuety::init().

Lisatud tööde kontrollimine

assert_pushed()

Kontrollige, et kindlat tööklassi oleks vähemalt üks kord käivitatud.

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

Lisage valikuline tagasihelistamisfunktsioon, et filtreerida payload’i või muude atribuutide alusel. Funktsioon saab argumendina salvestatud tööandmete massiivi, mille võtmed on handler, payload, queue ja instance. Fassaadi või trait’i Dispatchable kaudu väljastatud tööde puhul on instance väärtus null, seega filtreerige väärtuste handler ja payload järgi.

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

assert_pushed_times()

Kontrollige, et töö oleks lisatud täpselt kindel arv kordi.

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

assert_not_pushed()

Kontrollige, et tööd poleks kordagi väljastatud.

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

assert_nothing_pushed()

Kontrollige, et ühtegi tööd poleks väljastatud.

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

Partiide kontrollimine

assert_batched()

Kontrollige, et partii oleks väljastatud. Soovi korral lisage tagasihelistamisfunktsioon, et filtreerida partii sisu järgi.

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

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

Tagasihelistamisfunktsioon saab massiivi võtmetega jobs ja options.

Lisatud tööde uurimine

Kasutage pushed(), et hankida kõik kindla klassi salvestatud väljastused, ja batches(), et hankida kõik salvestatud partiid.

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

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

Lähtestamine testide vahel

Kõigi salvestatud tööde ja partiide tühjendamiseks ilma uut eksemplari loomata kutsuge jäljendil välja reset().

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

Jäljendi ja kogu sisemise oleku täielikuks mahavõtmiseks kutsuge välja Queuety::reset().

Täielik näide

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