Функциональность Тестовой очереди?

Согласно документации 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() - мне нужно издеваться над этим?

1 ответ

Решение

Идея использования подделок заключается в том, что они являются альтернативой насмешкам. Так что, да, если вы хотите издеваться над этим 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';
});
Другие вопросы по тегам