Покращте тестування HTTP помилок за допомогою методу requestException() у Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 13 травня, 2025
Laravel інтегрує нову можливість для тестування з методом requestException(), який спрощує створення виключень HTTP-клієнта для ефективнішого тестування помилок. Чи готові ви дізнатися, як цей метод змінив підхід до роботи з API у ваших проектах? Читайте далі, щоб дізнатися більше про покращення в тестуванні з Laravel

Laravel покращує можливості тестування для розробників завдяки методу requestException(), який спрощує створення виключень HTTP-клієнта для більш ефективного тестування помилок

Тестування взаємодії з зовнішніми API вимагає симуляції різних відповідей про помилки, щоб перевірити правильність обробки виключень. Раніше створення RequestException вимагало довгого та багатокрокового коду. Новий метод requestException() пропонує лаконічний і елегантний варіант:

use Illuminate\Support\Facades\Http;

// Створення виключення запиту з конкретним тілом відповіді та кодом статусу
$exception = Http::requestException(['error' => 'invalid_token'], 401);

// Створення виключення запиту лише з кодом статусу
$exception = Http::requestException(status: 500);

// Створення виключення запиту з заголовками
$exception = Http::requestException(
    ['message' => 'Too many requests'],
    429,
    ['X-RateLimit-Reset' => '30']
);

Поліпшення читабельності очевидне:

// Раніше: громіздкий, багатокроковий процес
$exception = new RequestException(
    new Response(
        Http::response(['code' => 'invalid_token'], 401)->wait()
    )
);

// Після: простий, односторонній підхід
$exception = Http::requestException(['code' => 'invalid_token'], 401);

Цей метод особливо покращує тестування сервісів, які взаємодіють із зовнішніми API:

class PaymentGatewayTest extends TestCase
{
    public function test_it_handles_api_authentication_errors()
    {
        Http::fake([
            'api.payment.com/*' => Http::response(['error' => 'Invalid API key'], 401),
        ]);

        // Тестуємо обробку 401 помилок сервісом
        $gateway = new PaymentGateway();
        $result = $gateway->processPayment($paymentData);

        $this->assertFalse($result->success);
        $this->assertEquals('authentication_failed', $result->error);

        // Тестуємо обробку виключень за допомогою конструкції try-catch
        try {
            // Мокаємо HTTP-клієнт, щоб він кинув виключення
            Http::fake(function () {
                throw Http::requestException(['error' => 'Invalid API key'], 401);
            });

            $gateway->processPaymentOrFail($paymentData);
            $this->fail('Виключення не було кинуто');
        } catch (PaymentAuthenticationException $e) {
            $this->assertEquals(401, $e->getStatusCode());
            $this->assertEquals('Invalid API key', $e->getErrorMessage());
        }
    }
}

Метод requestException() створює чистіші та легші для підтримки тести для обробки помилок у взаємодії з HTTP, підвищуючи якість коду та зменшуючи складність тестування