如何测试 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 作业?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Laravel 5.1 在 IronMQ 中获取排队作业的数量?

Laravel 5.1 中的随机 cron 作业

Laravel 5 如何测试重定向

Laravel 5.7 - 队列作业太慢

如何测试 Laravel 5 控制器方法

Laravel 5 每 30 秒安排一次作业