Testaus
Queuety tarjoaa QueueFake-luokan, joka korvaa varsinaisen jonon muistissa olevalla tietovarastolla. Lähetetyt työt tallennetaan tietokantaan kirjoittamisen sijaan, ja myös create_batch() tallentaa erän metatiedot muistiin. Näin voit varmistaa töiden lähettämisen toiminnan suorittamatta työntekijöitä tai kirjoittamatta tietokantaan. Käsittelijän nimellä lähettäminen hakee käsittelijän edelleen rekisteristä, joten kutsu ensin Queuety::init(), kun lähetät työn merkkijonomuotoisella käsittelijällä; Contracts\Job-esiintymät, chain(), create_batch() ja batch() toimivat ilman sitä.
Valekomponentin käyttöönotto
Kutsu Queuety::fake() testisi alussa. Se palauttaa QueueFake-esiintymän, joka tallentaa kaikki myöhemmät töiden lähetykset.
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() luo uuden QueueFake-olion ja kytkee sen Queuety-julkisivuun. Queuety::dispatch() ja Dispatchable::dispatch() tallentavat jonoon lisätyt työt. Queuety::chain() tallentaa jokaisen ketjutetun työn tavallisena lisäyksenä lähetysjärjestyksessä. Queuety::create_batch() tallentaa sekä jonoon lisätyt työt että assert_batched()-metodin käyttämät erän metatiedot. Queuety::batch() tallentaa jonoon lisätyt työt, mutta ei luo valemetatietoja eristä.
Tyhjennä valekomponentti testien välissä kutsumalla Queuety::reset()-metodia tearDown()-kohdassa. Se tyhjentää julkisivun kaiken tilan, joten kutsu uudelleen Queuety::init(), jos myöhemmässä testissä tarvitaan varsinainen jono.
Jonoon lisättyjen töiden tarkistaminen
assert_pushed()
Varmista, että tietty työluokka lähetettiin vähintään kerran.
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 );
}
Välitä valinnainen takaisinkutsufunktio, jolla suodatetaan hyötykuorman tai muiden ominaisuuksien perusteella. Takaisinkutsufunktio saa tallennetun työn tietotaulukon, jonka avaimet ovat handler, payload, queue ja instance. instance on null töille, jotka lähetetään julkisivun tai Dispatchable-piirteen kautta, joten hae töitä handler- ja payload-arvojen perusteella.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Varmista, että työ lisättiin jonoon täsmälleen tietyn määrän kertoja.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Varmista, ettei työtä lähetetty koskaan.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Varmista, ettei yhtäkään työtä lähetetty.
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();
}
Erien tarkistaminen
assert_batched()
Varmista, että erä lähetettiin. Voit halutessasi välittää takaisinkutsufunktion erän sisällön suodattamiseen.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
Takaisinkutsufunktio saa taulukon, jonka avaimet ovat jobs ja options.
Jonoon lisättyjen töiden tarkastelu
Hae pushed()-metodilla kaikki tietylle luokalle tallennetut lähetykset ja batches()-metodilla kaikki tallennetut erät.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Nollaaminen testien välillä
Tyhjennä kaikki tallennetut työt ja erät luomatta uutta esiintymää kutsumalla valekomponentin reset()-metodia.
$this->fake->reset();
Voit myös purkaa valekomponentin ja tyhjentää kaiken sisäisen tilan kutsumalla Queuety::reset()-metodia.
Täysi esimerkki
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();
}
}