Pereiti prie turinio

Testavimas

Queuety pateikia QueueFake klasę, kuri tikrąją eilę pakeičia atmintyje veikiančia saugykla. Išsiųstos užduotys įrašomos, o ne saugomos duomenų bazėje; create_batch() taip pat atmintyje įrašo paketinių užduočių metaduomenis. Taip galite patikrinti užduočių išsiuntimo veikimą nepaleisdami vykdytojų ir nerašydami į duomenų bazę. Išsiunčiant pagal apdorojimo komponento pavadinimą, komponentas vis tiek ieškomas registre, todėl, jei išsiunčiate pagal eilutės pavidalo apdorojimo komponentą, pirmiausia iškvieskite Queuety::init(); Contracts\Job egzemplioriai, chain(), create_batch() ir batch() veikia ir be šio iškvietimo.

Netikros eilės nustatymas

Testo pradžioje iškvieskite Queuety::fake(). Jis grąžina QueueFake egzempliorių, kuris įrašo visus vėlesnius užduočių išsiuntimus.

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() sukuria naują QueueFake ir prijungia jį prie Queuety fasado. Queuety::dispatch() ir Dispatchable::dispatch() registruoja į eilę įkeltas užduotis. Queuety::chain() registruoja kiekvieną grandininę užduotį kaip įprastą įkėlimą į eilę pagal išsiuntimo tvarką. Queuety::create_batch() registruoja ir į eilę įkeltas užduotis, ir paketų metaduomenis, kuriuos naudoja assert_batched(). Queuety::batch() registruoja į eilę įkeltas užduotis, bet nesukuria netikrų paketų metaduomenų.

Per testus iškvieskite Queuety::reset() tearDown(), kad išvalytumėte netikrą eilę. Taip išvaloma visa fasado būsena, todėl iškvieskite Queuety::init() dar kartą, jei vėlesniam testui reikia tikros eilės.

Tikrinimas, ar užduotys buvo įkeltos į eilę

assert_pushed()

Patikrinkite, ar konkrečios užduočių klasės užduotis buvo išsiųsta bent kartą.

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

Galite perduoti pasirenkamą atgalinio iškvietimo funkciją, kuri filtruoja pagal naudingąją apkrovą ar kitus atributus. Funkcija gauna registruotų užduoties duomenų masyvą su raktais handler, payload, queue ir instance. Per fasadą arba požymį Dispatchable išsiųstų užduočių instance yra null, todėl filtruokite pagal handler ir payload.

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

assert_pushed_times()

Patikrinkite, ar užduotis į eilę įkelta tiksliai nurodytą kartų skaičių.

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

assert_not_pushed()

Patikrinkite, ar užduotis niekada nebuvo išsiųsta.

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

assert_nothing_pushed()

Patikrinkite, ar išvis nebuvo išsiųsta jokių užduočių.

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

Paketų tikrinimas

assert_batched()

Patikrinkite, ar paketas buvo išsiųstas. Pasirinktinai galite perduoti atgalinio iškvietimo funkciją, kuri filtruoja pagal paketo turinį.

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

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

Funkcija gauna masyvą su raktais jobs ir options.

Į eilę įkeltų užduočių peržiūra

Naudokite pushed(), kad gautumėte visas užregistruotas konkrečios klasės išsiųstas užduotis, ir batches(), kad gautumėte visus užregistruotus paketus.

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

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

Būsenos nustatymas iš naujo tarp testų

Iškvieskite netikro objekto reset(), kad išvalytumėte visas užregistruotas užduotis ir paketus nesukurdami naujo egzemplioriaus.

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

Arba iškvieskite Queuety::reset(), kad visiškai panaikintumėte netikrą objektą ir visą vidinę būseną.

Išsamus pavyzdys

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