测试队列功能?

时间:2017-09-30 13:54:32

标签: php laravel phpunit mockery laravel-testing

根据Laravel Documentation,我可以使用Queue::fake();阻止作业排队。

在不排队的情况下,如何在Job Class中测试(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()的示例 - 我需要嘲笑它吗?

1 个答案:

答案 0 :(得分:2)

使用假货的想法是它们可以替代嘲弄。所以,是的,如果你想模仿deleteAllFiles()被调用,那么我不相信你可以用假的那样做。

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

有一件事,它不在您的示例中,但请确保您的工作正在实施\Illuminate\Contracts\Queue\ShouldQueue

像这样的东西

<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

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';
});