Skip to content

Мокирование

Режим моков

Создавайте правила в UI (вкладка Mocks) или программно. Устаревший плоский API по-прежнему работает и проксирует в встроенную группу default:

ts
const { addMock, removeMock } = useNetworkDashboard()

const rule = addMock({
  name: 'Mock /api/users',
  urlPattern: '/api/users',
  method: 'GET',
  enabled: true,
  response: {
    status: 200,
    body: [{ id: 1, name: 'Alice' }],
    delay: 200, // опциональная искусственная задержка в мс
  },
})

removeMock(rule.id)

Замоканные ответы логируются обычным образом с бейджем mock и metadata.mocked = true, так что вы можете сразу видеть, какие записи были перехвачены. Поддерживаются оба Fetch и XHR.

Группы моков

Правила можно организовать в именованные группы. Каждая группа имеет собственный переключатель включения/выключения — отключение группы приостанавливает все её правила без потери их индивидуальных состояний включённости. Группы сворачиваемые; двойной клик по имени группы переименовывает её инлайн.

ts
const {
  addMockGroup,
  renameMockGroup,
  toggleMockGroup,
  removeMockGroup,
  addMockToGroup,
  updateMockInGroup,
  removeMockFromGroup,
  mockGroups, // Ref<readonly MockRulesGroup[]>
} = useNetworkDashboard()

// Создать группу
const groupId = addMockGroup('Auth mocks')

// Добавить в неё правило
addMockToGroup(groupId, {
  urlPattern: '/api/refresh',
  method: 'POST',
  response: {
    status: 401,
    body: { error: 'token_expired' },
    delay: 300,
  },
})

// Отключить всю группу (индивидуальные состояния правил сохраняются)
toggleMockGroup(groupId, false)

// Переименовать
renameMockGroup(groupId, 'Auth & Session')

// Удалить
removeMockGroup(groupId)

В UI клик по + в заголовке группы открывает инлайн-форму добавления/редактирования прямо внутри этой группы. Группы сохраняются в localStorage под ключом vue-network-dashboard:mockGroups, когда включён persistToStorage.

Импорт / экспорт конфигурации моков

Панель инструментов Mocks содержит кнопки Import и Export.

Export сериализует все группы и правила в JSON-файл (mock-config.json):

json
{
  "version": 1,
  "groups": [
    {
      "id": "grp_a1b2c3",
      "name": "Auth mocks",
      "enabled": true,
      "rules": [
        {
          "id": "rule_x7y8z9",
          "urlPattern": "/api/refresh",
          "method": "POST",
          "enabled": true,
          "response": { "status": 401, "body": { "error": "token_expired" }, "delay": 300 }
        }
      ]
    }
  ]
}

Import читает файл и вызывает replaceMockGroups(), который атомарно заменяет всю конфигурацию — без конфликтов ID, предсказуемое поведение.

ts
// Программная замена
const { replaceMockGroups } = useNetworkDashboard()
replaceMockGroups(parsedGroups)

Типичные сценарии использования: переключение между заранее подготовленными файлами сценариев (счастливый путь, ошибки авторизации, недоступность бэкенда), обмен набором моков с коллегами или загрузка подготовленной конфигурации для демо без обращения к серверу.

Мок из лога

В детальном виде любого захваченного HTTP-запроса кликните Mock, чтобы создать правило мока, предзаполненное путём URL, методом, кодом статуса и телом ответа из этой записи лога. Вкладка Mocks открывается автоматически с новым правилом, готовым к редактированию или включению.

Условия мока

Правила моков можно сузить дополнительными условиями совпадения помимо URL и метода. Добавьте условия в редакторе правила в секции Conditions:

typescript
interface MockRule {
  // ...
  conditions?: {
    queryParams?: Record<string, string> // пары URL ?key=value (все должны совпасть)
    headers?: Record<string, string> // значения заголовков запроса (все должны совпасть)
    bodyFields?: Record<string, unknown> // значения полей JSON-тела (все должны совпасть)
  }
}

Все условия внутри правила объединяются через AND. Например, направьте один и тот же POST /api/search на разные ответы-моки в зависимости от поля в теле запроса:

typescript
// Возвращает результаты поиска для пользовательских запросов
dashboard.addMock({
  urlPattern: '/api/search',
  method: 'POST',
  conditions: { bodyFields: { type: 'user' } },
  response: { status: 200, body: { items: [{ id: 1, name: 'Alice' }] } },
})

// Возвращает пустой список для запросов по товарам
dashboard.addMock({
  urlPattern: '/api/search',
  method: 'POST',
  conditions: { bodyFields: { type: 'product' } },
  response: { status: 200, body: { items: [] } },
})

Трансформация ответа

Режим Transform позволяет изменить реальный ответ сервера, не заменяя его полностью. Запрос уходит на настоящий бэкенд; после получения ответа перехватчик применяет объявленные трансформации и возвращает изменённый Response в приложение. Запись лога помечается как mock, указывая, что ответ был изменён.

typescript
interface MockRule {
  mode?: 'mock' | 'transform' // по умолчанию: 'mock'
  transform?: {
    status?: number // Переопределить HTTP-код статуса
    headers?: Record<string, string> // Добавить или перезаписать заголовки ответа
    bodyMerge?: Record<string, unknown> // Глубоко слить поля в JSON-тело
    bodyDelete?: string[] // Удалить поля из JSON-тела
  }
}

Пример — внедрить флаг isAdmin и удалить внутреннее поле:

typescript
dashboard.addMock({
  urlPattern: '/api/me',
  method: 'GET',
  mode: 'transform',
  enabled: true,
  response: { status: 200 }, // обязательное поле; игнорируется в режиме transform
  transform: {
    bodyMerge: { isAdmin: true, beta: true },
    bodyDelete: ['internalId'],
  },
})

В UI переключайтесь между Mock и Transform через переключатель режима в редакторе правила — видимые поля формы обновляются соответственно.

Импорт OpenAPI

Кликните OpenAPI в панели инструментов Mocks, чтобы загрузить файл спецификации OpenAPI 3.x или Swagger 2.x в формате JSON. Парсер генерирует одно правило мока на каждую комбинацию path + method, строит пример тела ответа из схемы и добавляет все правила в новую группу, названную по info.title.

typescript
// Пример: загрузка спецификации Petstore → создаёт ~18 правил моков одним кликом
// Все правила добавляются в группу: "Swagger Petstore"

Сгенерированные правила используют mode: 'mock' со статусом 200 и телом, выведенным из первой успешной схемы ответа. Ссылки $ref разрешаются автоматически. Никаких внешних зависимостей — парсер занимает ~120 строк TypeScript.

После импорта правила можно включать по отдельности, редактировать или экспортировать как JSON-конфиг, как и любую другую группу моков.