Search code examples
phplaravelphpunitassertjobs

How I can test that one Laravel job dispatches an another one on testing?


I have the following Laravel Worker:

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;

use App\Lobs\AnotherJob;

class MyWorker implements ShouldQueue
{
    use Dispatchable;
    use InteractsWithQueue;
    use Queueable;

    public function handle(): void
    {
       AnotherJob::dispatch();
    }
}

And I want to unit-test that my job dispatches the AnotherJob:

namespace Tests;

use Illuminate\Foundation\Testing\TestCase;

class TestMyWorker extends TestCase
{
  public function testDispachesAnotherJob()
  {
    MyWorker::dispatchNow();
    //Assert that AnotherJob is dispatched
  }
}

Do you know how I can seert that AnotherJob::dispatch() is actually be called?


Solution

  • Laravel has queue mocks/fakes that will handle that. Try this:

    namespace Tests;
    
    use Illuminate\Foundation\Testing\TestCase;
    use Illuminate\Support\Facades\Queue;
    use App\Jobs\MyWorker;
    use App\Jobs\AnotherJob;
    
    class TestMyWorker extends TestCase
    {
      public function testDispachesAnotherJob()
      {
        Queue::fake();
        MyWorker::dispatchNow();
        Queue::assertPushed(MyWorker::class);
        Queue::assertPushed(AnotherJob::class);
      }
    }