{"meta":{"title":"レイヤーを抽象化するためのモック オブジェクトを作成する","intro":"コパイロットチャット は、単体テストに使用できるモック オブジェクトの作成に役立ちます。","product":"GitHub Copilot","breadcrumbs":[{"href":"/ja/copilot","title":"GitHub Copilot"},{"href":"/ja/copilot/tutorials","title":"チュートリアル"},{"href":"/ja/copilot/tutorials/copilot-chat-cookbook","title":"GitHub Copilot チャットクックブック"},{"href":"/ja/copilot/tutorials/copilot-chat-cookbook/testing-code","title":"コードのテスト"},{"href":"/ja/copilot/tutorials/copilot-chat-cookbook/testing-code/create-mock-objects","title":"モック オブジェクトを作成する"}],"documentType":"article"},"body":"# レイヤーを抽象化するためのモック オブジェクトを作成する\n\nコパイロットチャット は、単体テストに使用できるモック オブジェクトの作成に役立ちます。\n\n単体テストを作成するときは、分離されていること、外部サービスに依存していないことを確認することが重要です。 これを実現する方法の 1 つは、アプリケーションのレイヤーを抽象化するモック オブジェクトを作成することです。 コパイロットチャット は、このようなモック オブジェクトの作成に必要なコードの生成に役立ちます。\n\n## サンプル シナリオ\n\nTypeScript を使用して構築したランナーの一覧を表示する Web サイトがあるとします。 データベースからランナーをフェッチするサービスと、このサービスを使うサーバー側のコードがあります。 あなたはサーバー側のコードをテストする一方で、データベースへの呼び出しは行いたくないと考えています。 サービス用のモック オブジェクトの生成を コパイロットチャット に依頼できます。\n\n```typescript id=mock-service\n// SvelteKit example at +page.server.ts\nimport service from './service';\n\nexport async function load({ params }) {\n  const runner = await service.getRunner(params.id);\n\n  return {\n    runner\n  };\n}\n```\n\n## プロンプトの例\n\nこの例では、テストに [vitest](https://vitest.dev/) を使っていることを前提としていますが、他のテスト ランナーでも機能します。\n\n```copilot copy prompt ref=mock-service\n/tests Create a unit test to ensure the service is called correctly. Mock the service object.\n```\n\nCopilot でモデルとして使用する既存のテストがある場合は、`#file: path/to/test-file.js` を使用してファイルのパスを指定し、この情報をプロンプトに含めることができます。\n\n## 応答の例\n\n> \\[!NOTE] 次の応答は例です。 コパイロットチャット の応答は非決定的であるため、ここで示したものとは異なる応答が返される可能性があります。\n\nCopilot からは、実装する計画と、モックを含むコード テキストが提供されます。\n\n```typescript\nimport { describe, it, expect, vi, beforeEach } from 'vitest';\nimport { load } from './+page.server.ts';\n\n// Mock the entire service module\nvi.mock('./service', () => ({\n  default: {\n    getRunner: vi.fn()\n  }\n}));\n\n// Import the mocked service\nimport service from './service';\n\ndescribe('load function', () => {\n  const mockRunner = {\n    id: '123',\n    name: 'Test Runner',\n    status: 'active'\n  };\n\n  beforeEach(() => {\n    // Reset mock before each test\n    vi.resetAllMocks();\n\n    // Setup default mock implementation\n    (service.getRunner as any).mockResolvedValue(mockRunner);\n  });\n\n  it('should fetch runner with correct id', async () => {\n    const params = { id: '123' };\n    const result = await load({ params });\n\n    expect(service.getRunner).toHaveBeenCalledWith('123');\n    expect(service.getRunner).toHaveBeenCalledTimes(1);\n    expect(result).toEqual({ runner: mockRunner });\n  });\n});\n```\n\n## 参考資料\n\n* [GitHub Copilot Chat のプロンプト エンジニアリング](/ja/copilot/using-github-copilot/prompt-engineering-for-github-copilot)\n* [GitHub Copilot の使用に関するベスト プラクティス](/ja/copilot/using-github-copilot/best-practices-for-using-github-copilot)"}