测试队列功能



根据Laravel文档,我可以使用Queue::fake();防止工作排队。

尚不清楚如何测试(phpunit)在没有排队的情况下在工作类中使用几种方法。

例如:

class ActionJob extends Job
{
    public $tries = 3;
    protected $data;
    public function __construct($data)
    {
        $this->data = $data;
    }

    public function handle()
    {
        if ($this->data['action'] == "deleteAllFiles") {
            $this->deleteAllFiles();
        }
    }
    protected function deleteAllFiles()
    {
        //delete all the files then return true
        // if failed to delete return false
    }
}

这是我要测试deleteAllFiles()的示例 - 我需要模拟它吗?

使用假货的想法是它们是嘲笑的替代方法。所以,是的,如果您想嘲笑deleteAllFiles()被称为,那么我不相信您可以使用假货。

但是,您可以断言作业中存在某个属性。

一件事,这不是您的示例,但请确保您的工作正在实现IlluminateContractsQueueShouldQueue

类似这样的东西

<?php
namespace AppJobs;
use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsQueueShouldQueue;
use IlluminateFoundationBusDispatchable;
class ActionJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    public $tries = 3;
    public $data; // Make sure this public so you can access it in your test
    public function __construct($data)
    {
        $this->data = $data;
    }

    public function handle()
    {
        if ($this->data['action'] == "deleteAllFiles") {
            $this->deleteAllFiles();
        }
    }
    protected function deleteAllFiles()
    {
        // do stuff
    }
}

然后在您的测试中:

// ActionJobTest.php
Queue::fake();
// Do some things to set up date, call an endpoint, etc.
Queue::assertPushed(ActionJob::class, function ($job) {
    return $job->data['action'] === 'deleteAllFiles';
});

如果您想在工作中断言$data,则可以在关闭中进行其他状态并断言。

旁注:如果作业是Disptachable,您也可以断言:

// ActionJobTest.php
Bus::fake();
// Do some things to set up date, call an endpoint, etc.
Bus::assertDispatched(ActionJob::class, function ($job) {
    return $job->data['action'] === 'deleteAllFiles';
});

最新更新