Ответ
Я тестирую API-клиенты, комбинируя изолированные юнит-тесты с моками и интеграционные тесты с реальным или заглушенным сервером.
1. Юнит-тестирование с моками (PHPUnit): Заменить реальный HTTP-клиент на mock-объект, чтобы проверить логику формирования запроса и обработки ответа.
// Пример с Guzzle и PHPUnit
$mockHandler = new MockHandler([
new Response(200, ['Content-Type' => 'application/json'], '{"id": 123}'),
new Response(404) // Тестирование обработки ошибок
]);
$handlerStack = HandlerStack::create($mockHandler);
$testClient = new Client(['handler' => $handlerStack]);
// Внедряем тестовый клиент в сервис
$apiService = new ApiService($testClient);
$result = $apiService->fetchUser(123);
$this->assertEquals(123, $result['id']);
2. Интеграционное тестирование с реальным тестовым API: Запускаю контейнер с тестовой версией API (например, используя Docker Compose) или использую сторонние сервисы-заглушки (WireMock, Mockoon).
3. Запись и воспроизведение трафика (PHP-VCR): Полезно для тестов, которые должны работать с реальными ответами API, но без сетевых запросов.
VCR::turnOn();
VCR::insertCassette('test_api.yml');
// Первый запуск — запись запроса/ответа на диск
// Последующие запуски — чтение с диска
$response = $client->get('https://api.example.com/data');
VCR::turnOff();
Ключевые проверки в моих тестах:
- Корректность HTTP-метода, URL, заголовков и тела запроса.
- Обработка успешных ответов (парсинг JSON/XML).
- Обработка ошибок (4xx, 5xx, таймауты).
- Поведение при сетевых сбоях.