【问题标题】:Test Queue functionality?测试队列功能?
【发布时间】:2018-03-12 05:12:44
【问题描述】:

根据Laravel Documentation,我可以使用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() - 我需要模拟它吗?

【问题讨论】:

  • 你试过prevar_dumpdie;吗?您可以在删除任何内容之前将其添加到函数 deleteAllFiles() 中。如果你需要一个例子,就说,我写一个。
  • @RonnieOosting 我说的是用 phpunit 做测试。
  • 你能告诉我们你是如何从你的控制器(或者你从其他地方调用它的)调用作业的吗?
  • @tptcat 它将从控制器调用。例如:dispatch(new ActionJob(['action' => 'deleteAllFiles']));

标签: php laravel phpunit mockery laravel-testing


【解决方案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 进行断言,那么您可以进行一些其他状态更改并在闭包中对其进行断言。

旁注:如果 Job 是 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';
});

【讨论】:

  • 啊,我明白了,现在说得通了。您能否提供模拟 deleteAllFiles() 方法的示例,假设返回 true 并且必须调用 handle()
  • 在这种方法中,您断言数据,而不是调用特定方法。我会专门发布另一个关于嘲笑的问题,因为这与 Laravel 无关。为了了解更多关于模拟的信息,这对我很有帮助:jtreminio.com/2013/03/…
  • 谢谢。看起来我将不得不在测试中做类似$job = new ActionJob(...); $job-&gt;handle(); 的事情。我以为Queue::fake(); 会自动调用handle()
  • 没有。伪造它的主要目的是断言它已排队或分派。
猜你喜欢
  • 1970-01-01
  • 2021-02-24
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-23
  • 2020-12-09
相关资源
最近更新 更多