Тестирование взаимодействия с событиями очереди LaravelPhp

Кемеровские программисты php общаются здесь
Anonymous
Тестирование взаимодействия с событиями очереди Laravel

Сообщение Anonymous »

У меня есть пакет с несколькими прослушивателями событий, которые прослушивают события, создаваемые очередью Laravel:

Код: Выделить всё

class SetTrackableJobProcessingStatus
{
/**
* Create the event listener.
*/
public function __construct(
public TrackableJobUpdater $updater,
) {}

/**
* Handle the event.
*/
public function handle(JobProcessing $event): void
{
$jobUuid = $event->job->uuid();

if ($this->updater->trackableJobModelExists($jobUuid)) {
$trackableJobModel = $this->updater->retrieveTrackableJobModel($jobUuid);

$this->updater->setProcessingStatus($trackableJobModel);
}
}
}
Который использует эти методы в классе службы TrackableJobUpdater:

Код: Выделить всё

class TrackableJobUpdater
{
/**
* Set the job status to processing and update the started_at timestamp.
*/
public function setProcessingStatus(TrackableJob $trackableJob): bool
{
return $trackableJob->update([
'status' => Status::Processing,
'started_at' => now(),
]);
}

/**
* Determine if a trackable job model exists for a job using its uuid.
*/
public function trackableJobModelExists(string $uuid): bool
{
return TrackableJob::where('job_uuid', $uuid)->exists();
}

/**
* Retrieve a trackable job model using a job uuid.
*/
public function retrieveTrackableJobModel(string $uuid): TrackableJob
{
return TrackableJob::where('job_uuid', $uuid)->sole();
}
}
Как мне написать для этого тестовый пример, я могу проверить, что прослушиватель работает (проходит):

Код: Выделить всё

class SetTrackableJobQueuedStatusTest extends TestCase
{
use RefreshDatabase;

public function test_listens_to_laravel_job_queued_event(): void
{
Event::fake();

Event::assertListening(JobQueued::class, SetTrackableJobQueuedStatus::class);
}
}
Я также хочу проверить, работает ли прослушиватель, когда задание начинает обрабатываться. Как я могу вручную отправить/запустить событие JobProcessing точно так же, как его отправляет Laravel? Я попробовал:

Код: Выделить всё

public function test_updates_processing_status()
{
$jobProcessingEventListener = new SetTrackableJobProcessingStatus(new TrackableJobUpdater());
$jobProcessingEventListener->handle(new JobProcessing('default', new TrackedSuccessfulJob()));
}
Где TrackedSuccessfulJob — это обычный класс задания, расширяющий пользовательский класс отслеживания.
Но это дает мне предупреждение:

Ожидается параметр типа '\Illuminate\Contracts\Queue\Job'

И ошибка:

Вызов неопределенного метода uuid() в

Простая диспетчеризация задание типа TrackedSuccessfulJob::dispatch(); не отправляет все события. Например, событие JobQueued не отправляется.

Подробнее здесь: https://stackoverflow.com/questions/786 ... eue-events

Вернуться в «Php»