Тестирование
Утилиты для тестирования кода, использующего createRestClient() или PipelineOrchestrator, без обращения к реальному backend. Импортируйте из отдельной точки входа rest-pipeline-js/testing, поэтому ничто из этого не попадает в продакшен-бандл.
createMockAdapter(routes)
ts
createMockAdapter(routes: MockRoute[]): MockAdapterЗаменяет сеть набором определений маршрутов — это HttpAdapter (см. HTTP-адаптер) с историей вызовов и (опционально) последовательными ответами для проверки повторов.
ts
import { createRestClient } from 'rest-pipeline-js'
import { createMockAdapter } from 'rest-pipeline-js/testing'
const adapter = createMockAdapter([
{ method: 'GET', url: '/users/1', respond: { data: { id: 1, name: 'Ada' } } },
// Динамический ответ — читает запрос, чтобы построить ответ
{
method: 'POST',
url: '/orders',
respond: (info) => ({ data: { id: 42, ...(info.data as object) }, status: 201 }),
},
// Последовательность ответов, по одному на каждый совпадающий вызов — проверка логики повторов:
// первые две попытки проваливаются, третья успешна. После исчерпания повторяет последнюю запись.
{
method: 'GET',
url: '/flaky',
respond: [{ error: true, status: 503 }, { error: true, status: 503 }, { data: { ok: true } }],
},
])
const client = createRestClient({ baseURL: 'https://api.example.com', adapter })
const user = await client.get('/users/1')
// adapter.calls — история всех обработанных запросов по порядку; проверяйте её в тестах
expect(adapter.calls).toHaveLength(1)Параметры
routes: MockRoute[]
| Поле | Описание |
|---|---|
method | HTTP-метод для совпадения. Опустите, чтобы совпадать с любым методом. |
url | Совпадает по подстроке (string) либо через .test() (RegExp) с относительным URL (config.url, например /users/1), а не с полным URL. |
respond | Объект ответа, функция (info) => response, читающая запрос для построения ответа, либо массив ответов, потребляемых по одному на вызов (после исчерпания повторяет последний). |
delayMs | Имитирует сетевую задержку через настоящий setTimeout (нормально работает под vi.useFakeTimers()/аналогами). |
Возвращает
MockAdapter — HttpAdapter плюс:
calls— история всех обработанных запросов по порядку.reset()— очищаетcallsи перематывает любые массивные последовательностиrespondв начало, не трогая сами маршруты.
Заметки
- Ответ со
status >= 400по умолчанию отклоняется (как это делают axios/fetch), выбрасывается какErrorс заданными.statusи.response.status/.response.data/.response.headers— этого достаточно, чтобы работалиretry.retriableStatus,circuitBreakerи перехватчики ошибок. Переопределяется явнымerror: true/falseв спецификации ответа. - Отсутствие маршрута, подходящего под запрос, немедленно бросает исключение с понятным сообщением, вместо зависания — тест с недостающей настройкой маршрута проваливается явно.
Более полный пример, включая использование с PipelineOrchestrator через httpConfig, см. в examples/mock-adapter.ts.