Laravel introduces new test helpers to control deferred operation execution, allowing developers to test deferred functions without waiting for the request lifecycle to complete.
Control deferred execution in your tests:
// triggered deferred operations won't execute immediatelyProduct::create(['name' => 'Widget']);$this->assertAgainstSomeDeferredOutcome(); // ❌ Fails // triggered deferred operations execute immediately$this->withoutDefer();Product::create(['name' => 'Widget']);$this->assertAgainstSomeDeferredOutcome(); // ✅ Passes
Here's how you might use it in your test suite:
class OrderProcessingTest extends TestCase{ public function test_confirmation_email_is_queued_after_order() { Mail::fake(); $this->withoutDefer(); $order = Order::create([ 'customer_id' => 123, 'total' => 99.99, 'status' => 'pending' ]); Mail::assertQueued(OrderConfirmationEmail::class, function ($mail) use ($order) { return $mail->hasTo($order->customer->email); }); } public function test_inventory_tracking_is_updated() { Event::fake(); $this->withoutDefer(); $product = Product::factory()->create(); $product->adjustStock(-5); Event::assertDispatched(InventoryAdjusted::class, function ($event) use ($product) { return $event->product_id === $product->id; }); $this->withDefer(); }}
These helpers make it straightforward to test code that relies on deferred execution without waiting for the end of the request lifecycle.