# echolot mock (/ru/docs/cli/mock)

`echolot mock` поднимает мок: либо мок, сохранённый в рабочем пространстве, с его [маршрутами, созданными
вручную](/docs/mocks/routes), и со спецификацией, если она есть, либо документ OpenAPI, операции которого отвечают
задокументированными примерами или телом, построенным по их схеме. Используйте его, чтобы писать клиент до появления
API или чтобы дать заданию CI сервер, который отвечает так, как вам нужно. Он обслуживает те же моки, что и
[страница «Моки»](/docs/mocks).

```sh
echolot mock <source> [--workspace <workspace>] [--port <port>] [--share] [--delay <ms>] [--failure-rate <percent>] [--no-validate] [--routes <file>]
```

`<source>` — это файл спецификации (YAML или JSON), а с `--workspace` — имя мока, сохранённого в этом рабочем
пространстве.

## Мок спецификации [#mock-a-spec]

```sh
echolot mock Alpenglow.echolot/specs/alpenglow.yaml --port 4010
```

```text
Mock of Alpenglow demo shop: 9 operations at http://127.0.0.1:4010/v1 (Ctrl-C stops it)
```

Мок отвечает по пути первого сервера спецификации (здесь `/v1`). Каждый запрос, на который он отвечает, — строка в
стандартном выводе: статус, метод и путь, подошедшая операция, откуда взялся ответ и время. Проблемы запроса
перечислены под ней.

```text
200 GET /v1/products/TNT-MH-2P  → GET /products/{sku} (generated)  0 ms
400 POST /v1/orders  → POST /orders  0 ms
    body $.lines: expected array, got string
```

**Запросы проверяются по спецификации.** Запрос, параметры или тело которого нарушают спецификацию, получает `400` с
объяснением, что не так:

```json
{
  "error" : "The request does not match the spec (POST /orders).",
  "problems" : [
    "body $.lines: expected array, got string"
  ]
}
```

`--no-validate` отвечает на такие запросы всё равно.

**Выбор ответа.** По умолчанию операция отвечает своим первым успешным ответом и первым примером. Запрос может
потребовать другой с помощью `Prefer: code=404, example=empty` или заголовков Postman `x-mock-response-code` и
`x-mock-response-name`.

## Мок рабочего пространства [#mock-a-workspaces-mock]

С `--workspace` `<source>` называет мок, сохранённый на странице «Моки» (имя его файла в `mocks/` без `.toml` или его
имя). Его порт, задержка, доля сбоев, проверка запросов, выбранные ответы и маршруты действуют, а указанные вами
параметры их переопределяют. Его маршруты на JavaScript (`mocks/<name>.js`) отвечают первыми, затем маршруты,
созданные вручную, затем спецификация; см. [скриптовые маршруты](/docs/mocks/scripted-routes) и
[маршруты и тестовые данные](/docs/mocks/routes).

```sh
echolot mock shop -w Alpenglow.echolot --delay 300
```

Моку из маршрутов спецификация не нужна:

```sh
echolot mock storefront -w Shop.echolot
```

```text
Mock of Storefront: 3 routes at http://127.0.0.1:4321 (Ctrl-C stops it)
200 GET /users/42  → GET /users/{id} (OK)  1 ms
404 GET /users/0  → GET /users/{id} (Not found)  0 ms
```

Каждая строка называет маршрут, который ответил, и в скобках — ответ, который он дал. Тестовые значения в телах
создаются заново для каждого запроса. Чтобы создавать тестовые данные без сервера, см. [echolot fake](/docs/cli/fake).

## Параметры [#options]

| Параметр | Значение |
| --- | --- |
| `-w`, `--workspace <folder>` | Папка рабочего пространства, где лежит мок. |
| `--port <port>` | Порт. По умолчанию — собственный порт мока или 4010. |
| `--share` | Отвечать на всех сетевых интерфейсах, а не только на этом Mac: для контейнеров и телефонов. |
| `--delay <ms>` | Миллисекунд перед каждым ответом. |
| `--failure-rate <percent>` | Доля запросов в процентах, на которые отвечают искусственной ошибкой `500`. |
| `--no-validate` | Отвечать на запросы, нарушающие спецификацию, вместо того чтобы отклонять их с `400`. |
| `--routes <file>` | Маршруты на JavaScript, которые отвечают раньше спецификации. По умолчанию — `mocks/<name>.js` мока рабочего пространства. |

Без `--share` мок слушает только 127.0.0.1, поэтому ничто другое в сети до него не достанет. С `--share` достанет любой,
кто может добраться до вашего Mac.

Тело запроса сверх лимита мока получает `413` и до маршрута не доходит.

## В CI [#in-ci]

Запустите мок в фоне и выполняйте прогон на нём. Окружение Alpenglow **Local** направляет `{{baseURL}}` на
`http://localhost:8787/v1`, поэтому мок на порту 8787 отвечает на его запросы:

```sh
echolot mock Alpenglow.echolot/specs/alpenglow.yaml --port 8787 &
echolot run Alpenglow.echolot --env local --folder catalog
kill %1
```

## Коды выхода [#exit-codes]

Мок работает, пока вы его не остановите. Он завершается с кодом `64` при неверном параметре или имени мока, которого нет
в рабочем пространстве, и с кодом `1`, когда спецификацию не удалось прочитать или порт занят.
