Skip to main content

レイヤーを抽象化するモック オブジェクトを作成する

Copilot Chat は、単体テストに使用できるモック オブジェクトの作成に役立ちます。

単体テストを作成するときは、分離されていること、外部サービスに依存していないことを確認することが重要です。 これを実現する方法の 1 つは、アプリケーションのレイヤーを抽象化するモック オブジェクトを作成することです。 Copilot Chat は、このようなモック オブジェクトの作成に必要なコードを生成するのに役立ちます。

サンプル シナリオ

TypeScript を使って構築した、ランナーの一覧を表示する Web サイトがあるとします。 データベースからランナーをフェッチするサービスと、このサービスを使うサーバー側のコードがあります。 あなたは、サーバー側のコードをテストする一方で、データベースへの呼び出しは行いたくないと考えています。 Copilot Chat にサービスのモック オブジェクトを生成するよう依頼できます。

// SvelteKit example at +page.server.ts
import service from './service';

export async function load({ params }) {
  const runner = await service.getRunner(params.id);

  return {
    runner
  };
}

プロンプトの例

この例では、テストに vitest を使っていることを前提としていますが、他のテスト ランナーでも機能します。

/tests Create a unit test to ensure the service is called correctly. Mock the service object.

Copilot でモデルとして使用したい既存のテストがある場合は、#file: path/to/test-file.js を使ってファイルのパスを指定し、この情報をプロンプトに含めることができます。

応答の例

Note

次の応答は例です。 Copilot Chat の応答は非決定的であるため、ここで示したものとは異なる応答が返される可能性があります。

Copilot からは、実装する計画と、モックを含むコード テキストが提供されます。

import { describe, it, expect, vi, beforeEach } from 'vitest';
import { load } from './+page.server.ts';

// Mock the entire service module
vi.mock('./service', () => ({
  default: {
    getRunner: vi.fn()
  }
}));

// Import the mocked service
import service from './service';

describe('load function', () => {
  const mockRunner = {
    id: '123',
    name: 'Test Runner',
    status: 'active'
  };

  beforeEach(() => {
    // Reset mock before each test
    vi.resetAllMocks();

    // Setup default mock implementation
    (service.getRunner as any).mockResolvedValue(mockRunner);
  });

  it('should fetch runner with correct id', async () => {
    const params = { id: '123' };
    const result = await load({ params });

    expect(service.getRunner).toHaveBeenCalledWith('123');
    expect(service.getRunner).toHaveBeenCalledTimes(1);
    expect(result).toEqual({ runner: mockRunner });
  });
});

参考資料