Тести не повинні ходити в реальні сторонні API: вони стають повільними, нестабільними, залежать від мережі й можуть створювати справжні платежі чи відправляти справжні SMS.
Http::fake() підміняє відповіді:
use Illuminate\Http\Client\Request;
use Illuminate\Support\Facades\Http;
it('stores the tracking status', function () {
Http::fake([
'api.example.com/v1/parcels/*' => Http::response(['data' => ['status' => 'delivered']]),
'api.example.com/*' => Http::response(status: 404),
]);
app(ParcelTracker::class)->refresh($parcel);
expect($parcel->fresh()->status)->toBe('delivered');
Http::assertSent(fn (Request $request) =>
$request->url() === 'https://api.example.com/v1/parcels/123'
&& $request->hasHeader('Authorization')
);
});
Сценарії збоїв - так само просто:
Http::fake(['api.example.com/*' => Http::response(status: 503)]);
// послідовність: спершу помилка, потім успіх - перевірка повторів
Http::fake([
'api.example.com/*' => Http::sequence()
->pushStatus(503)
->push(['data' => ['status' => 'delivered']]),
]);
// мережевий збій (ConnectionException)
Http::fake(['api.example.com/*' => Http::failedConnection()]);
Http::preventStrayRequests() - будь-який запит без підготовленої фейкової відповіді кидає виняток. Найкраще ввімкнути глобально в базовому класі тестів чи Pest.php: тоді жоден тест випадково не піде в мережу, навіть якщо хтось забув Http::fake.
Корисні перевірки:
Http::assertSentCount(2)- скільки запитів зроблено;Http::assertNothingSent()- запитів не було (наприклад, через кеш);Http::assertSentInOrder([...])- порядок.
Реалістичні відповіді. Найкраще зберігати справжні (знеособлені) відповіді API у файлах-фікстурах і віддавати їх з Http::response(json_decode(file_get_contents(...))). Тести тоді перевіряють розбір саме того формату, що надсилає провайдер.
Пісочниці провайдерів (тестові ключі Stripe, LiqPay, Monobank) - для ручної перевірки й рідкісних інтеграційних тестів, які запускаються окремо від основного набору, а не для кожного прогону CI.
Обмеження фейків: вони перевіряють ваш код проти вашого уявлення про API. Якщо провайдер змінив формат, фейки цього не помітять - тут допомагають контрактні тести чи моніторинг помилок у продакшені.