如何测试 Laravel 5 作业?
Posted
技术标签:
【中文标题】如何测试 Laravel 5 作业?【英文标题】:How to test Laravel 5 jobs? 【发布时间】:2018-03-31 22:08:58 【问题描述】:当工作完成时,我尝试捕捉一个事件
测试代码:
class MyTest extends TestCase
public function testJobsEvents ()
Queue::after(function (JobProcessed $event)
// if ( $job is 'MyJob1' ) then do test
dump($event->job->payload());
$event->job->payload()
);
$response = $this->post('/api/user', [ 'test' => 'data' ], $this->headers);
$response->assertSuccessful($response->isOk());
UserController中的方法:
public function userAction (Request $request)
MyJob1::dispatch($request->toArray());
MyJob2::dispatch($request->toArray());
return response(null, 200);
我的工作:
class Job1 implements ShouldQueue
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $data = [];
public function __construct($data)
$this->data= $data;
public function handle()
// Process uploaded
作业完成后我需要检查一些数据,但我从
$event->job->payload()
in Queue::after
而且我不明白如何检查作业?
【问题讨论】:
你可能想要mock your queued jobs 不,我需要将作业传递到队列并等待完成 L8也有great explanation 【参考方案1】:好吧,要测试handle
方法中的逻辑,您只需要实例化作业类并调用handle
方法。
public function testJobsEvents()
$job = new \App\Jobs\YourJob;
$job->handle();
// Assert the side effect of your job...
记住,工作毕竟只是一门课。
【讨论】:
【参考方案2】:Laravel 版本 ^5 || ^7
同步调度
如果您想立即(同步)调度作业,您可以使用 dispatchNow 方法。使用此方法时,作业不会排队,会立即在当前进程内运行:
Job::dispatchNow()
Laravel 8 更新
<?php
namespace Tests\Feature;
use App\Jobs\ShipOrder;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Support\Facades\Bus;
use Tests\TestCase;
class ExampleTest extends TestCase
public function test_orders_can_be_shipped()
Bus::fake();
// Perform order shipping...
// Assert that a job was dispatched...
Bus::assertDispatched(ShipOrder::class);
// Assert a job was not dispatched...
Bus::assertNotDispatched(AnotherJob::class);
【讨论】:
这在 Laravel 8 中已被弃用。 在 Laravel 8 中使用Job::dispatchSync()
。以上是关于如何测试 Laravel 5 作业?的主要内容,如果未能解决你的问题,请参考以下文章