Вловлюємо несподівані HTTP запити у тестах Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 березня, 2025
Бажаєте дізнатися, як Laravel захищає ваші тести від непередбачених HTTP-запитів? Читайте далі, щоб дізнатися про метод preventStrayRequests і способи зробити ваші API-тести більш надійними та ізольованими

Метод preventStrayRequests у Laravel забезпечує захист вашого тестового середовища, ловлячи та викидаючи виключення у випадку, якщо зовнішні HTTP-запити не були належним чином змодельовані. Це гарантує, що ваші тести залишаються ізольованими, передбачуваними і не залежать від зовнішніх сервісів.

Такий підхід особливо корисний у CI/CD середовищах або під час роботи з сторонніми API, оскільки непередбачені мережеві виклики можуть уповільнювати тести або викликати випадкові збої.

use Illuminate\Support\Facades\Http;
 
// Увімкнути захист від незмодельованих запитів
Http::preventStrayRequests();
 
// Налаштуйте фейкові відповіді
Http::fake([
    'example.com/*' => Http::response(['data' => 'example'], 200)
]);

Ось приклад реалізації всебічного захисту тестування API:

<?php
 
namespace Tests\Feature;
 
use Tests\TestCase;
use App\Services\WeatherService;
use Illuminate\Support\Facades\Http;
 
class WeatherServiceTest extends TestCase
{
    protected function setUp(): void
    {
        parent::setUp();
 
        // Запобігти будь-яким незмодельованим HTTP-запитам
        Http::preventStrayRequests();
 
        // Налаштування фейкових відповідей
        Http::fake([
            'api.weather.com/current*' => Http::response([
                'temperature' => 72,
                'conditions' => 'Sunny',
                'humidity' => 45
            ]),
 
            'api.weather.com/forecast*' => Http::response([
                'daily' => [
                    ['day' => 'Monday', 'high' => 75, 'low' => 60],
                    ['day' => 'Tuesday', 'high' => 80, 'low' => 65]
                ]
            ]),
 
            // Ловити будь-який інший запит з помилкою
            '*' => Http::response('Unexpected request', 500)
        ]);
    }
 
    public function test_gets_current_weather()
    {
        $service = new WeatherService();
        $weather = $service->getCurrentWeather('New York');
 
        $this->assertEquals(72, $weather['temperature']);
        $this->assertEquals('Sunny', $weather['conditions']);
    }
 
    public function test_gets_weather_forecast()
    {
        $service = new WeatherService();
        $forecast = $service->getForecast('Chicago');
 
        $this->assertCount(2, $forecast['daily']);
        $this->assertEquals('Monday', $forecast['daily'][0]['day']);
    }
}

Будь-який непередбачений HTTP-запит, який не був належним чином змодельований, викличе виключення, що допоможе підтримувати надійний тестовий пакет, який дійсно ізолює ваш код від зовнішніх залежностей