Підмінити HTTP-клієнт Laravel фейковими відповідями, щоб тест не залежав від мережі й чужого сервісу.
it('imports exchange rates', function () {
Http::fake([
'api.rates.example/*' => Http::response(['usd' => 41.2], 200),
'*' => Http::response(status: 500),
]);
(new ImportRates)->handle();
expect(Rate::latest()->value('usd'))->toBe(41.2);
Http::assertSent(fn (Request $request) => str_contains($request->url(), 'api.rates.example')
&& $request->hasHeader('Authorization'));
});
Що варто знати:
- Шаблони URL з
*підмінюють групи запитів. Запит, що не збігся з жодним шаблоном, піде в мережу насправді. Http::preventStrayRequests()забороняє такі запити: будь-який непідмінений кидатиме виняток. Його вмикають уTestCaseчиPest.phpдля всього набору.Http::sequence()повертає різні відповіді на послідовні виклики - так перевіряють повтори після помилки.- Помилки теж тестують: таймаут, 429, 500 - саме там зазвичай ховаються баги обробки.
Межа фейку: він закріплює ваше уявлення про чужий API. Коли провайдер змінить формат, тести лишаться зеленими - тому корисні контрактні перевірки чи хоча б моніторинг справжніх відповідей у проді.