Через Http::fake() - запити не йдуть у мережу, а отримують задані відповіді.
it('imports exchange rates', function () {
Http::preventStrayRequests();
Http::fake([
'api.rates.example/*' => Http::response(['usd' => 41.2, 'eur' => 44.9]),
]);
app(RatesImporter::class)->import();
expect(Rate::where('code', 'usd')->value('value'))->toBe(41.2);
Http::assertSent(fn (Request $r) => $r->hasHeader('Authorization'));
});
Що підміняють:
- конкретні адреси шаблонами з
*; - послідовності:
Http::sequence()->push(...)->pushStatus(500)- перша відповідь успішна, друга з помилкою; - збій з'єднання:
Http::failedConnection(); - логіку: замикання, що повертає відповідь залежно від запиту.
Перевірки запитів: assertSent, assertNotSent, assertSentCount, assertNothingSent.
preventStrayRequests() - будь-який непідмінений запит кидає виняток. Його ставлять у базовому TestCase чи Pest.php: тест, що випадково ходить у справжній API, стає повільним, нестабільним і може щось змінити в чужій системі.
Що обов'язково покрити: не лише успіх, а й 500, таймаут, 429, неочікуваний формат відповіді - саме ці гілки ламаються в продакшені.