Skip to content

Тестирование

Утилиты для тестирования кода, использующего 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[]

ПолеОписание
methodHTTP-метод для совпадения. Опустите, чтобы совпадать с любым методом.
urlСовпадает по подстроке (string) либо через .test() (RegExp) с относительным URL (config.url, например /users/1), а не с полным URL.
respondОбъект ответа, функция (info) => response, читающая запрос для построения ответа, либо массив ответов, потребляемых по одному на вызов (после исчерпания повторяет последний).
delayMsИмитирует сетевую задержку через настоящий setTimeout (нормально работает под vi.useFakeTimers()/аналогами).

Возвращает

MockAdapterHttpAdapter плюс:

  • 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.