如何在Laravel中手动触发队列工作,以便在Behat / PHPUnit中添加测试覆盖率

时间:2018-10-22 10:43:21

标签: laravel laravel-5 phpunit behat

我最近发现了一个可排队的作业,该作业批量生成页面的PDF版本失败了,但是(通过浏览器)单独调用有问题的PDF版本并没有失败,因此我们的测试管道通过了。

经过调查,我们发现这是由刀片模板引用Auth :: user()上的方法引起的,因为当通过浏览器通过根调用时,Auth :: user()可作为User的合法实例使用模型。但是,当队列由Daemon运行时,Auth :: user()为 null ,因此刀片未渲染。几个月以来,这种情况并未引起注意,因为我们认为,只需以用户身份登录并分别加载PDF版本,我们的测试范围就足够了。

修复很容易。我刚刚添加了对Auth :: user()不为null的检查,然后再引用它。但是,在Blade中引用Auth :: user()是一种完全正常的做法,将来可能会添加更多。

我该如何编写重新创建/模拟Daemon所调用代码的条件的测试范围?我不在乎Behat还是PHPUnit。

我曾尝试这样称呼Artisan ...

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

...但是它永远挂着!

我还尝试鞭打Queueable Job的实例并调用handle()方法,但它总是成功的,即使我引入的中断代码在通过CLI运行队列时也会失败。

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

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

$generatePortfolio = new GeneratePortfolio($learnerPortfolio);

$success = $generateLearnerPortfolio->handle();

return [
    'success' => $success
];

是否可以通过某种方式模拟QueueWorker如何调用作业并可靠地获取结果?

0 个答案:

没有答案