# モック (/ja/docs/mocks)

モックは、Macのポートで動作し、APIのように応答するサーバです。APIがまだない間や、実際のAPIが停止している間も、フロントエンド、アプリ、テストから利用できます。
モックは、次の2つの情報源から単独で、または組み合わせて応答します。

- **手書きのルート**：メソッドとパス、そして応答するJSON、XML、テキスト。ボディにはリクエストごとに変わるダミーデータ（`{{$randomFullName}}`、`{{$randomEmail}}`）や、リクエストの一部（`{{request.params.id}}`）を含められます。仕様は不要です。[ルートとダミーデータ](/docs/mocks/routes)を参照してください。
- **OpenAPI仕様**：すべてのオペレーションが、仕様に記述されたレスポンス、その例、またはスキーマから作った本文で応答します。仕様に違反するリクエストには理由を示す`400`が返るので、クライアントが誤ったものを送信したときにもモックが教えてくれます。

コードや状態が必要な応答には、モックに[JavaScriptのルート](/docs/mocks/scripted-routes)も使えます。

このページは、サイドバーのモジュール切り替えで**モック**を選ぶか、<kbd>⌘</kbd><kbd>4</kbd>で開きます。

<Shot id="mocks-running" alt="実行中のAlpenglowデモショップのモック。上部にアドレスと「環境で使用」「停止」、仕様を示す設定カード、手書きの2つのルートを示すルートカード、下部にルートと仕様から応答したリクエストのログが表示されている" />

## モックを作成する [#creating-a-mock]

サイドバーの<strong>モック</strong>ヘッダーの<strong>+</strong>をクリックするか、空のページのボタンを使います。

- **新規モック**は、ルートで構成するモックを作成します。最初に、5人分のダミーのユーザーを返す`GET /users`ルートが1つ含まれているので、開始してボディでできることを確認できます。これを変更するか、自分のルートを追加します。[ルートとダミーデータ](/docs/mocks/routes)を参照してください。
- **仕様のモック**（**+**メニュー、または空のページの**仕様のモック**）は、ワークスペース内の仕様のモックを作成します。たとえば**Alpenglow demo shopのモック**のようになります。

新しいモックには、`4010`から数えて最初の空きポートが割り当てられます。
モックの設定とルートはワークスペースの`mocks`フォルダ内のファイルになるため、チームはGitでモックを共有できます。

ルートのモックから仕様を提供することも、仕様のモックにルートを追加することもできます。**設定**カードの**仕様を提供**で仕様を追加し、**変更** › **仕様の提供を停止**で外します。

## 開始と停止 [#starting-and-stopping]

**開始**（<kbd>⌘</kbd><kbd>R</kbd>）をクリックします。上部のバーにモックのアドレスが`http://127.0.0.1:4010`のように表示されます。
モックが提供する仕様のサーバURLにパスが含まれる場合（`https://demo.echolot.dev/v1`）、アドレスはそのパスで終わり（`http://127.0.0.1:4010/v1`）、モックはそのパスの下で応答します。リクエストでそのパスを省略しても構いません。
アドレスの横のコピーボタンで、アドレスをコピーできます。

ターミナルから試してみましょう。

```sh
curl http://127.0.0.1:4010/users
```

**停止**で停止します。どのモックが動作中かはサイドバーに表示されます。緑のドットと、仕様のタイトルの横のポートまたはルートの数です（`Alpenglow demo shop · :4010`、`3 routes · stopped`）。
モックを右クリックすると、<strong>開始</strong>または<strong>停止</strong>と<strong>削除…</strong>を選べます。削除する前に確認が表示されます。設定ファイルはゴミ箱に入り、仕様は残ります。

モックは、そのワークスペースのウインドウが開いている間、動作します。動作中のモックは、ルート、仕様、設定の変更を、停止せずに取り込みます。
ほかのプログラムが使っているポートは使えません。その場合はEcholotが知らせるので、別のポートを選択してください。

### モックにリクエストを送信する [#sending-requests-to-the-mock]

- **ルート**カードの**リクエストを作成**は、モックのルートを呼び出すリクエストのフォルダを作成し、`{{baseUrl}}`にモックのアドレスを設定します。[ルートからのリクエスト](/docs/mocks/routes#requests-from-routes)を参照してください。
- **環境で使用**（モックの動作中）は、`{{baseUrl}}`がモックのアドレスである`Mock: <name>`という名前の環境を作成し、それを有効にします。
  仕様から[リクエストを生成](/docs/specs#requests-that-follow-the-spec)で作成されるような、`{{baseUrl}}`で始まるリクエストは、別の環境を選択するまで、モックに送信されます。[環境](/docs/workspaces/environments)を参照してください。

## 設定 [#settings]

| 設定 | 内容 |
| --- | --- |
| **名前** | サイドバーに表示されるモックの名前。 |
| **仕様** | 提供する仕様、または**なし：ルートだけが応答します**。**開く**は仕様ページで仕様を開き、**仕様を提供**と**変更**は仕様を選択するか、提供を停止します。 |
| **ポート** | 待ち受けるポート（1〜65535）。 |
| **ネットワーク上の他のデバイスに応答** | すべてのネットワークインターフェースで待ち受けます。スマートフォンやコンテナからのテストに使います。オフの場合は、このMacからのみ接続できます。 |
| **遅延** | 応答の前に待つミリ秒数（最大60,000）。遅いAPIを試すために使います。 |
| **失敗** | `500`を意図的に返すリクエストの割合（％）。クライアントの対処を試すために使います。 |
| **チェック** | 仕様がある場合：**仕様に違反するリクエストを拒否（理由付きで400）**。デフォルトでオンです。 |

## リクエストが受け取るレスポンス [#which-response-a-request-gets]

リクエストは、そのメソッドとパスに応答を持つ、次のうち最初のものに渡されます。

1. モックの[JavaScriptのルート](/docs/mocks/scripted-routes)。何も設定しないルートは、リクエストを次に渡します。
2. [手書きのルート](/docs/mocks/routes)。ルートには複数のレスポンスを持たせられます。リクエストが名前またはステータスで指定することも、リクエストに対するルールで別のものを選ぶことも、それ以外はルートのデフォルトが応答することもできます。
3. 次に説明する、仕様のオペレーション。

ルートでもオペレーションでも、固定のパスセグメントはパラメータより優先されるため、`/pets/mine`は`/pets/{id}`より先に選ばれます。

仕様のオペレーションでは、モックは次の順序でレスポンスを選びます。

1. リクエストが指定したもの：`Prefer: code=404, example=empty`ヘッダー、またはPostmanの`x-mock-response-code`と`x-mock-response-name`ヘッダー。
2. **仕様のレスポンス**カードでそのオペレーションに選択したレスポンス。
3. オペレーションの最初の成功レスポンス。

**仕様のレスポンス**カードには、すべてのオペレーションがメニューとともに一覧表示されます。**最初の成功レスポンス**、または記述されているステータスのいずれかで、複数の例があるステータスでは、その例を選べます。選択はモックとともに保存されます。

ボディは、レスポンスの名前付きの例（指定されたもの、または最初のもの）、単一の`example`、またはスキーマから作った本文です。
スキーマから作る場合は、各フィールドの型、フォーマット、名前に合ったダミーデータ（フォーマットが`email`のフィールドならメールアドレス）が、スキーマの制約の範囲内で、リクエストごとに作り直されます。
パスパラメータと同じ名前のフィールドには、その値が入ります。
仕様に複数のメディアタイプが記述されている場合は、リクエストの`Accept`ヘッダーで1つが選ばれます。記述されているヘッダーとコンテンツタイプも送信されます。
`204`、`304`、`HEAD`への応答にはボディがありません。

モックが返すそのほかの応答は次のとおりです。

| ステータス | 条件 |
| --- | --- |
| `400` | モックが仕様を提供していてチェックがオンで、リクエストが仕様に違反している場合：パス、クエリ、ヘッダー、Cookieのパラメータの欠落や型の誤り、コンテンツタイプの誤り、JSON Schemaに合わないボディ。ボディにすべての理由が一覧表示されます。 |
| `404` | そのパスを持つルートもオペレーションもない。 |
| `405` | パスはあるが、このメソッドではない。`Allow`ヘッダーに、ルートと仕様を合わせた、受け付けるメソッドが一覧表示されます。 |
| `413` | リクエストボディが32 MBを超えている。 |
| `500` | 意図的な失敗（**失敗**を参照）。 |
| `501` | 指定されたステータスのレスポンスが、オペレーションに記述されていない。 |

ブラウザは別のポートのページからモックを呼び出せます。モックはプリフライトリクエストに応答し、CORSヘッダーを送信します。

## ログ [#the-log]

ページの下部には、選択したモックが応答したリクエストが新しい順に一覧表示されます。時刻、ステータス、メソッドとパス、使われたレスポンス（ルートのレスポンス名、仕様の例の名前、またはボディがスキーマから作られた場合は`generated`）、かかった時間です。
問題は、リクエストの下の行に表示されます。仕様に違反した箇所や、ルートのボディで作れなかったダミーの値などです。
リクエストにポインタを置くと、レスポンスボディ、リクエストのボディ、コンテンツタイプが表示されます。**レスポンスをコピー**でボディをコピーできます。**消去**でログを空にします。

Appleのオンデバイスモデルが利用できる場合は、**消去**の横のボタンでログを要約できます。

## 例を仕様に保存する [#saving-examples-into-the-spec]

仕様のオペレーションでは、モックが何を返すかの唯一の情報源が仕様なので、実際に得たレスポンスは例として仕様に保存します。
[履歴](/docs/workspaces/history)で、仕様に従うリクエストのやり取りを右クリックし、<strong>モックの例として保存…</strong>を選択します。`two tents`のような名前を付けて、<strong>保存</strong>をクリックします。

レスポンスは、そのリクエストが従う仕様の、該当オペレーションのレスポンスの名前付きの例になります。**仕様のレスポンス**カードで選択するか、`Prefer: example=two tents`で指定します。

仕様にないパスや、仕様のないモックには、[ルート](/docs/mocks/routes)を作成して、ボディを貼り付けます。

## ネットワークで共有する [#sharing-on-the-network]

**ネットワーク上の他のデバイスに応答**をオンにすると、スマートフォン、タブレット、コンテナからモックに接続できます。ほかのデバイスは、ローカルネットワーク上のMacのアドレスとモックのポートを使います。

初回は、Echolotがローカルネットワーク上のデバイスを見つけて接続することを許可するかどうか、macOSが確認する場合があります。許可しないと、ほかのデバイスからモックに接続できません。
あとから、**システム設定 › プライバシーとセキュリティ › ローカルネットワーク**で変更できます。

オンにすると、ネットワーク上の誰でもモックを呼び出せます。必要がないときは、共有をオフにしてください。

## コマンドラインから [#from-the-command-line]

`echolot mock alpenglow.yaml`は仕様ファイルを提供し、`echolot mock -w <workspace> <mock>`は、ワークスペースのモックを、仕様の有無にかかわらず設定とルートとともに提供します。CIやコンテナで使えます。[echolot mock](/docs/cli/mock)を参照してください。
[`echolot fake`](/docs/cli/fake)は、同じテンプレートからダミーデータを作成します。フィクスチャやシードデータに使えます。

エージェントは、EcholotのMCPサーバを通じてモックを開始してログを読み取れます。また、**モック**ツールセットがオンの場合は、モックの作成、ルートの追加と変更、ダミーデータの生成、ルートからのリクエストの作成もできます。[エージェント](/docs/ai/agents)を参照してください。
