メインコンテンツまでスキップ

モックサーバー機能ガイド

Laravel Spectrumのモックサーバー機能を使用すると、生成されたOpenAPIドキュメントから自動的にモックAPIサーバーを起動できます。これにより、フロントエンド開発やAPI統合テストを実際のバックエンドなしで行うことができます。

🎭 概要

モックサーバーは以下の機能を提供します:

  • 自動レスポンス生成 - OpenAPIスキーマに基づいてリアルなレスポンスを生成
  • 認証シミュレーション - Bearer Token、API Key、Basic認証をシミュレート
  • バリデーション - リクエストパラメータの検証
  • シナリオベースレスポンス - 成功/エラーなど複数のシナリオに対応
  • レスポンス遅延 - ネットワーク遅延のシミュレーション

🚀 基本的な使い方

モックサーバーの起動

# デフォルト設定で起動
php artisan spectrum:mock

# カスタムポートで起動
php artisan spectrum:mock --port=3000

# カスタムホストとポート
php artisan spectrum:mock --host=0.0.0.0 --port=8080

起動時の出力例

🚀 Starting Laravel Spectrum Mock Server...
📄 Loading spec from: storage/app/spectrum/openapi.json

🎭 Mock Server Configuration:
+------------------+-------------------------+
| Setting | Value |
+------------------+-------------------------+
| API Title | Laravel API |
| API Version | 1.0.0 |
| Server URL | http://127.0.0.1:8081 |
| Total Endpoints | 24 |
| Default Scenario | success |
+------------------+-------------------------+

📋 Available Endpoints:
+--------+------------------------+--------------------------------+
| Method | Path | Description |
+--------+------------------------+--------------------------------+
| GET | /api/users | List all users |
| POST | /api/users | Create a new user |
| GET | /api/users/{id} | Get user by ID |
| PUT | /api/users/{id} | Update user |
| DELETE | /api/users/{id} | Delete user |
+--------+------------------------+--------------------------------+

🎯 Mock server running at http://127.0.0.1:8081
Press Ctrl+C to stop

🔧 コマンドオプション

利用可能なオプション

php artisan spectrum:mock [options]
オプションデフォルト説明
--host127.0.0.1バインドするホストアドレス
--port8081リッスンするポート番号
--specstorage/app/spectrum/openapi.jsonOpenAPI仕様ファイルのパス
--delayなしレスポンス遅延(ミリ秒)
--scenariosuccessデフォルトのレスポンスシナリオ

使用例

# カスタムOpenAPIファイルを使用
php artisan spectrum:mock --spec=docs/api-spec.json

# 500msの遅延を追加
php artisan spectrum:mock --delay=500

# エラーシナリオをデフォルトに設定
php artisan spectrum:mock --scenario=error

🎯 レスポンスシナリオ

シナリオの指定方法

クエリパラメータ _scenario を使用してレスポンスシナリオを動的に切り替えられます:

# 成功レスポンス
curl http://localhost:8081/api/users?_scenario=success

# エラーレスポンス
curl http://localhost:8081/api/users?_scenario=error

# 空のレスポンス
curl http://localhost:8081/api/users?_scenario=empty

利用可能なシナリオ

  • success - 正常なレスポンス(デフォルト)
  • error - エラーレスポンス(通常500エラー)
  • empty - 空のデータレスポンス
  • unauthorized - 認証エラー(401)
  • forbidden - 権限エラー(403)
  • not_found - リソースが見つからない(404)
  • validation_error - バリデーションエラー(422)

🔐 認証シミュレーション

Bearer Token認証

# 有効なトークンでリクエスト
curl -H "Authorization: Bearer mock-token-123" \
http://localhost:8081/api/protected/resource

# 無効なトークンでリクエスト(401エラー)
curl -H "Authorization: Bearer invalid-token" \
http://localhost:8081/api/protected/resource

API Key認証

# ヘッダーでAPI Keyを送信
curl -H "X-API-Key: mock-api-key-123" \
http://localhost:8081/api/protected/resource

# クエリパラメータでAPI Keyを送信
curl http://localhost:8081/api/protected/resource?api_key=mock-api-key-123

Basic認証

# Basic認証でリクエスト
curl -u username:password \
http://localhost:8081/api/protected/resource

認証トークンのモック

モックサーバーは以下のトークンを有効として認識します:

  • Bearer: mock-token-* のパターン
  • API Key: mock-api-key-* のパターン
  • Basic: 任意のユーザー名/パスワード

📝 バリデーションシミュレーション

モックサーバーはOpenAPIスキーマに基づいてリクエストを検証します:

必須フィールドの検証

# 必須フィールドが不足している場合(422エラー)
curl -X POST http://localhost:8081/api/users \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com"}'

# レスポンス
{
"message": "The given data was invalid.",
"errors": {
"name": ["The name field is required."]
}
}

型の検証

# 型が間違っている場合
curl -X POST http://localhost:8081/api/users \
-H "Content-Type: application/json" \
-d '{"name": "John", "age": "twenty"}'

# レスポンス
{
"message": "The given data was invalid.",
"errors": {
"age": ["The age must be an integer."]
}
}

🎨 レスポンスカスタマイズ

動的なレスポンス生成

モックサーバーは、OpenAPIスキーマから動的にレスポンスを生成します:

# OpenAPIスキーマ例
responses:
200:
content:
application/json:
schema:
type: object
properties:
id:
type: integer
example: 123
name:
type: string
example: "John Doe"
email:
type: string
format: email
created_at:
type: string
format: date-time

生成されるレスポンス:

{
"id": 123,
"name": "John Doe",
"email": "john.doe@example.com",
"created_at": "2024-01-15T10:30:00Z"
}

ページネーションサポート

# ページネーションパラメータ
curl "http://localhost:8081/api/users?page=2&per_page=10"

# レスポンス
{
"data": [...],
"links": {
"first": "http://localhost:8081/api/users?page=1",
"last": "http://localhost:8081/api/users?page=5",
"prev": "http://localhost:8081/api/users?page=1",
"next": "http://localhost:8081/api/users?page=3"
},
"meta": {
"current_page": 2,
"from": 11,
"to": 20,
"total": 50,
"per_page": 10,
"last_page": 5
}
}

🛠️ 高度な使用方法

CI/CDでの使用

# GitHub Actions例
- name: Start Mock Server
run: |
php artisan spectrum:generate
php artisan spectrum:mock --host=0.0.0.0 --port=8080 &
sleep 5

- name: Run Frontend Tests
run: |
npm test
env:
API_URL: http://localhost:8080

Dockerでの使用

# Dockerfile
FROM php:8.2-cli

# ... 他の設定 ...

EXPOSE 8081

CMD ["php", "artisan", "spectrum:mock", "--host=0.0.0.0"]
# docker-compose.yml
services:
mock-api:
build: .
ports:
- "8081:8081"
volumes:
- ./storage/app/spectrum:/app/storage/app/spectrum
command: php artisan spectrum:mock --host=0.0.0.0

複数バージョンのモック

# v1 API
php artisan spectrum:mock --spec=docs/v1/openapi.json --port=8081

# v2 API
php artisan spectrum:mock --spec=docs/v2/openapi.json --port=8082

💡 ベストプラクティス

1. 開発環境での使用

# package.jsonに追加
{
"scripts": {
"mock-api": "php artisan spectrum:mock",
"dev": "concurrently \"npm run mock-api\" \"npm run serve\""
}
}

2. テスト環境の設定

// jest.config.js
module.exports = {
setupFilesAfterEnv: ['./tests/setup.js'],
testEnvironment: 'node',
globals: {
API_URL: 'http://localhost:8081'
}
};

3. 環境変数の使用

# .env.testing
API_MOCK_HOST=0.0.0.0
API_MOCK_PORT=8081
API_MOCK_DELAY=100
# 環境変数を使用して起動
php artisan spectrum:mock \
--host=$API_MOCK_HOST \
--port=$API_MOCK_PORT \
--delay=$API_MOCK_DELAY

🔍 トラブルシューティング

ポートが使用中

# エラー: Address already in use
# 解決策: 別のポートを使用
php artisan spectrum:mock --port=8082

OpenAPIファイルが見つからない

# エラー: OpenAPI specification file not found
# 解決策: ドキュメントを生成
php artisan spectrum:generate
php artisan spectrum:mock

CORS エラー

モックサーバーはデフォルトでCORSを許可しています。問題がある場合は、ブラウザの開発者ツールでネットワークタブを確認してください。

📚 関連ドキュメント