【问题标题】:How to execute job:dispatch during phpunit如何执行作业:在 phpunit 期间调度
【发布时间】:2019-12-03 04:41:11
【问题描述】:

在我的phpunit.xml 中,我已将QUEUE_DRIVER 设置为空:

<env name="QUEUE_DRIVER" value="null"/>

很遗憾,作业调度没有执行。

例如,我有这个虚拟测试:

public function test_dummy()
{
    \App\Jobs\DummyJob::dispatch();
    dd('DummyJob is not executed');
}

这就是工作:

public function handle()
{
    dd('alright');
}

phpunit 返回

DummyJob 未执行

是否可以更改 phpunit.xml 以便立即执行作业补丁,就像处理排队的邮件一样?

【问题讨论】:

  • 我的猜测是,由于NullDriver has a fixed size of 0,dispatch 认为没有工作可做。您可能需要执行ArrayDriver extends NullDriver 之类的操作,并至少推入一个虚拟占位符。

标签: laravel phpunit


【解决方案1】:

我不得不将 QUEUE_DRIVERnull 更改为 sync

QUEUE_DRIVER 设置为null 将丢弃所有排队的作业。

设置 QUEUE_DRIVERtosync` 将立即运行排队的作业,因此建议用于测试目的,但不用于生产。

【讨论】:

    【解决方案2】:

    在测试期间测试队列功能的首选方法是使用内置的模拟功能。队列从同步到异步设置的行为不同(在模型引用上设置属性将同步而不是异步或类似)。断言使用正确的属性调用作业。

        Queue::fake();
    
        $answer = 42;
    
        Queue::assertPushed(YourJob::class, function ($job) use ($answer) {
            return $job->answer=== $answer;
        });
    

    这并不能测试它是否真的有效,相反,您应该像这样单独测试该作业。

    (new YourJob($answer))->handle();
    
    $this->assertDatabaseHas('your_awesome_table', ['column' => 'value']);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-18
      • 1970-01-01
      • 2013-08-06
      • 2021-04-26
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多