Тестване
Queuety предоставя клас QueueFake, който заменя реалната опашка с хранилище в паметта. Изпратените задачи се записват, вместо да се записват в базата данни, а create_batch() също записва метаданните за пакетите в паметта. Така можете да проверявате поведението при изпращане, без да стартирате работници или да записвате в базата данни. Изпращането по име на обработчик все още намира обработчика чрез регистъра, затова извикайте Queuety::init() първо за изпращане с низ като обработчик; обекти на Contracts\Job, chain(), create_batch() и batch() работят и без него.
Настройване на симулацията
Извикайте Queuety::fake() в началото на теста си. Той връща екземпляр на QueueFake, който записва всички следващи изпращания.
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() създава нов QueueFake и го свързва с фасадата Queuety. Queuety::dispatch() и Dispatchable::dispatch() записват добавените задачи. Queuety::chain() записва всяка задача от веригата като обикновено добавяне, в реда на изпращане. Queuety::create_batch() записва както добавените задачи, така и метаданните за пакета, използвани от assert_batched(). Queuety::batch() записва добавените задачи, но не създава фиктивни метаданни за пакета.
Извикайте Queuety::reset() в tearDown(), за да изчистите симулацията между тестовете. Той изчиства цялото състояние на фасадата, затова извикайте отново Queuety::init(), ако на по-късен тест му трябва реалната опашка.
Проверка дали задачите са добавени
assert_pushed()
Проверете дали конкретен клас задача е изпратен поне веднъж.
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 );
}
Подайте незадължителна функция за обратно извикване, за да филтрирате по полезен товар или други атрибути. Тя получава масива с данните за записаната задача с ключове handler, payload, queue и instance. instance е null за задачи, изпратени чрез фасадата или трейта Dispatchable, затова съпоставяйте по handler и payload.
$this->fake->assert_pushed( SendWelcomeEmailJob::class, function ( array $job ) {
return $job['payload']['to'] === 'user@example.com';
} );
assert_pushed_times()
Проверете дали дадена задача е добавена точен брой пъти.
$this->fake->assert_pushed_times( SendEmailJob::class, 3 );
assert_not_pushed()
Проверете дали дадена задача никога не е била изпратена.
$this->fake->assert_not_pushed( DeleteAccountJob::class );
assert_nothing_pushed()
Проверете дали изобщо не са изпратени задачи.
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();
}
Проверка на пакетите
assert_batched()
Проверете дали е изпратен пакет. По желание подайте функция за обратно извикване, за да филтрирате по съдържанието на пакета.
$this->fake->assert_batched();
$this->fake->assert_batched( function ( array $batch ) {
return count( $batch['jobs'] ) === 3;
} );
Функцията за обратно извикване получава масив с ключове jobs и options.
Преглед на добавените задачи
Използвайте pushed(), за да получите всички записани изпращания за даден клас, и batches(), за да получите всички записани пакети.
$emails = $this->fake->pushed( SendEmailJob::class );
// [ ['handler' => '...', 'payload' => [...], 'queue' => 'default', 'instance' => null], ... ]
$batches = $this->fake->batches();
// [ ['jobs' => [...], 'options' => [...]], ... ]
Нулиране между тестовете
Извикайте reset() върху симулацията, за да изчистите всички записани задачи и пакети, без да създавате нов екземпляр.
$this->fake->reset();
Или извикайте Queuety::reset(), за да деактивирате напълно симулацията и да изчистите цялото вътрешно състояние.
Пълен пример
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();
}
}