Use Queue::fakeExceptFor() to execute specific background jobs synchronously during a test while preventing all other jobs from running.
When testing a feature that dispatches multiple background jobs, using `Queue::fake()` prevents all jobs from executing. If your test relies on a critical job running inline, total faking breaks test setup.
`Queue::fakeExceptFor()` lets you specify jobs that should execute normally while faking the rest:
use App\Jobs\CriticalSystemJob;
use App\Jobs\EmailNotification;
use Illuminate\Support\Facades\Queue;
test('queue dispatches email while executing critical system job inline', function () {
Queue::fakeExceptFor(function () {
Queue::push(new CriticalSystemJob); // Executes inline
Queue::push(new EmailNotification); // Faked
// Faked jobs are tracked by assertion helpers
Queue::assertPushed(EmailNotification::class);
}, [CriticalSystemJob::class]);
});
- Allows real execution for essential side effects during integration tests
- Keeps unneeded jobs (emails, webhooks) isolated and faked
- Also available on
Event::fakeExceptFor()andBus::fakeExceptFor()
Tags:
#Laravel #Testing #Pest PHP