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, підвищуючи якість коду та зменшуючи складність тестування