Недавно я обнаружил, что работа с очередями, при которой пакетная генерация 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 вызывает задания, и надежно извлекатьрезультат?