Тестуйте свій код без мережі
PHPВикористовуйте тестовий дублер, який постачається з SDK, щоб ставити в чергу відповіді API й перевіряти запити, які надіслав ваш код.
4 хв читання
SDK постачається з тестовим дублером свого HTTP-клієнта. Тест ставить у чергу відповіді, які дав би API, запускає ваш код на справжньому SDK і читає назад запити, які SDK надіслав. Жоден запит не залишає процес, а ключем слугує будь-який непорожній текст.
Дублер — FakeHttpClient, у просторі імен Slen\Sdk\Testing: клієнт PSR-18.
Написати тест
1. Поставте відповідь у чергу
Створіть дублер і поставте в чергу відповідь API: статус і тіло, як їх надсилає API. Тіло успішної відповіді загорнуто в data.
use Slen\Sdk\Testing\FakeHttpClient;
$http = (new FakeHttpClient())->pushJson(200, ['data' => [
'execution_id' => '74438200973594700',
'status' => 'completed',
'operation' => 'generate_email',
'output' => ['content' => 'Hi Ada, just checking in on the proposal I sent last week.'],
'error' => null,
'error_code' => null,
'error_message' => null,
'cost' => ['estimated' => '0.00412500', 'actual' => null],
'cache' => ['hit' => false, 'cached_at' => null],
'replayed' => false,
'waiting_on' => null,
'trace_url' => '/v1/executions/74438200973594700',
]]);2. Дайте дублер SDK
SDK — справжній. Замінено лише його HTTP-клієнт, тому тест виконує той самий код, що й ваш застосунок.
use Slen\Sdk\SlenConfig;
use Slen\Sdk\SlenSdk;
$slen = SlenSdk::create(new SlenConfig(apiKey: 'key-for-tests', httpClient: $http));Дублер — це httpClient конфігурації.
3. Запустіть свій код
use Slen\Sdk\Modules\Operations\Options\ExecuteOptions;
$execution = $slen->operations()->execute(
'generate_email',
['messages' => [['role' => 'user', 'content' => 'Write a short follow-up email.']]],
new ExecuteOptions(idempotencyKey: 'order-42:email'),
);4. Перевірте, що пішло
Дублер записує кожен запит: метод, адресу, заголовки й тіло.
$sent = $http->lastRequest();
echo $execution->status->value, PHP_EOL;
echo $sent->getMethod(), ' ', $sent->getUri(), PHP_EOL;
echo $sent->getHeaderLine('Idempotency-Key'), PHP_EOL;
echo json_decode((string) $sent->getBody(), true)['operation'], PHP_EOL;lastRequest() повертає останній запит, а requests() — усі, як запити PSR-7.
Відповіді видаються в порядку черги
Кожен запит бере наступну відповідь із черги. Ставте в чергу по відповіді на кожен запит, який робить ваш код.
Дублер суворий. Запит, для якого в черзі немає відповіді, провалює тест із LogicException, і запит усе одно записується. Дублер, який прощав би зайвий запит, приховав би ту помилку, заради якої він потрібен, — виклик, надісланий двічі.
SDK надсилає запит ще раз після 429, 503 або коли відповіді не було — стільки разів, скільки каже retries, — Повтори й тайм-аути. Тест такої відповіді ставить у чергу по відповіді на кожну спробу або задає retries, що дорівнює 0, — усьому SDK чи в опціях одного виклику.
Протестувати помилку
Поставте помилку в чергу так само: її статус і конверт помилки API. SDK кидає ту помилку, яку кинув би на справжню відповідь. Конверт описує стаття Огляд.
{
"error": {
"code": "flow_not_found",
"message": "No flow is bound to operation \"generate_email\"",
"request_id": "0d3c1b9e-5a47-4f0e-9a36-2f6c8d1e7b42"
}
}pushException() ставить у чергу виняток HTTP-клієнта замість відповіді. Мережевий виняток PSR-18 зображає запит, який лишився без відповіді, і SDK після нього надсилає запит ще раз: поставте по одному на кожну спробу, і SDK кине ConnectionException після останньої.
Протестувати спани
RecordingSpanRecorder, переданий у конфігурацію як spanRecorder, тримає спани тесту: spans() повертає їх усі, а last() — останній, — Спани.
Що читати далі
Швидкий старт — виклик, який виконує тест цієї сторінки.
Асинхронні запуски й очікування — очікування читає статус кілька разів, тому його тест ставить у чергу кілька відповідей.
Обробка помилок — якою помилкою стає кожна відповідь.