Просте тестування відкладених операцій із використанням хелпера withoutDefer у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 19 червня, 2025
У Laravel з'явилися нові допоміжні функції для контролю виконання відкладених операцій, що дозволяє розробникам тестувати їх без очікування завершення життєвого циклу запиту. Чи хочете дізнатися, як ці можливості можуть спростити ваше тестування? Продовжуйте читати, щоб відкрити нові горизонти в написанні тестів у Laravel!

Laravel вводить нові тестові допоміжні функції для контролю виконання відкладених операцій, що дозволяє розробникам тестувати відкладені функції без необхідності дочекатися завершення життєвого циклу запиту.

Контролюйте відкладене виконання у своїх тестах:

// Відкладені операції не виконуються одразу
Product::create(['name' => 'Widget']);
$this->assertAgainstSomeDeferredOutcome(); // ❌ Невдача

// Відкладені операції виконуються одразу
$this->withoutDefer();
Product::create(['name' => 'Widget']);
$this->assertAgainstSomeDeferredOutcome(); // ✅ Успішно

Ось як це можна використовувати у вашому наборі тестів:

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();
    }
}

Ці допоміжні функції полегшують тестування коду, який залежить від відкладеного виконання, без необхідності дочекатися завершення життєвого циклу запиту