Как вручную запустить работу очереди в Laravel, чтобы я мог добавить тестовое покрытие в Behat / PHPUnit - PullRequest
0 голосов
/ 22 октября 2018

Недавно я обнаружил, что работа с очередями, при которой пакетная генерация PDF-версий страниц не удалась, но при вызове проблемных PDF-версий по отдельности (через браузер) не вызывала сбоев, поэтому наш тестовый конвейер проходил.

После исследования мы обнаружили, что это было вызвано шаблоном Blade, ссылающимся на метод Auth :: user (), потому что при вызове через корень через браузер Auth :: user () доступен в качестве легитимного экземпляра.Пользовательской модели.Однако, когда очередь запускается Daemon, Auth :: user () имеет значение null , поэтому Blades не рендерится.Это оставалось незамеченным в течение нескольких месяцев, потому что мы думали, что нашего тестового покрытия достаточно, просто войдя в систему как пользователь и загрузив PDF-версии по отдельности.

Исправить было легко.Я просто добавил проверки, что Auth :: user () не является нулевым, прежде чем ссылаться на него.Однако обращение к Auth :: user () в Blade - совершенно нормальная практика, и вполне вероятно, что в будущем может быть добавлено больше.

Как мне написать тестовое покрытие, которое воссоздает / имитирует условия вызова кода Daemon? Я не возражаю, будь то в Behat или в PHPUnit.

Я пытался вызвать Artisan следующим образом ...

Artisan::call('queue:work', [
    '--tries' => 1,
    '--timeout' => 4,
    '--once'
]);

... но он просто зависает навсегда!

Я также попытался вызвать экземпляр задания Queueable и вызвать дескриптор(), но он всегда завершается успешно, даже когда я ввожу взломанный код, который завершается неудачно, когда очередь запускается через CLI.

$user = User::find(26); // Our test user

$portfolio = $user->portfolios()->first();

$generatePortfolio = new GeneratePortfolio($learnerPortfolio);

$success = $generateLearnerPortfolio->handle();

return [
    'success' => $success
];

Есть ли какой-то способ, которым я могу смоделировать, как QueueWorker вызывает задания, и надежно извлекатьрезультат?

...