Cloudflare WorkersでのVitestテスト実装:Selfバインディングエラーの解決法

この記事では、Cloudflare WorkersでVitestを使用してテストを行う際に発生する「`SELF`バインディングエラー」の解決方法を解説しています。`poolOptions.workers.main`の設定を追加することで、ワーカーのエントリーポイントを正しく認識し、リアルなインテグレーションテストが可能になります。

広告ここから
広告ここまで

目次

    Cloudflare Workersの開発においてテストは重要な要素です。今回は、Vitestを使用したテスト中に発生した特定のエラー「Using service bindings to the current worker requires poolOptions.workers.main to be set to your worker's entrypoint」の解決方法について解説します。

    発生した問題について

    Cloudflare Workersのテスト時、SELFバインディングを使用してインテグレーションテストを行おうとした際に以下のエラーが発生しました:

    Error: Using service bindings to the current worker requires `poolOptions.workers.main` to be set to your worker's entrypoint

    これは、CloudflareのSELFオブジェクトを使用するテストで、ワーカーのエントリーポイントが正しく設定されていないことを示しています。

    WorkerのAPIを呼び出す処理でエラーが起きていた

    問題のあるテストコードはこのような形でした:

    it('ステータスページを返す (インテグレーションスタイル)', async () => {
      const response = await SELF.fetch('https://example.com');
      expect(await response.text()).toMatchInlineSnapshot(`"Bad Request"`);
    });

    SELF.fetchは現在のワーカーに対してリクエストを行うメソッドですが、これを使用するには特別な設定が必要です。

    解決方法

    このエラーを解決するには、Vitestの設定ファイル(通常はvitest.config.tsまたはvitest.config.js)にpoolOptions.workers.mainを追加する必要があります:

    // vitest.config.ts
    import { defineConfig } from 'vitest/config';
    
    export default defineConfig({
      test: {
        poolOptions: {
          workers: {
            main: './src/index.ts' // ワーカーのエントリーポイントを指定
          }
        }
      }
    });

    この設定により、SELFバインディングがワーカーのエントリーポイントを正しく認識できるようになります。

    Cloudflare WorkersでのVitestテストの基本

    Cloudflare Workersのテストには主に2つのアプローチがあります:

    1. ユニットテスト: worker.fetch()を直接呼び出してワーカーの機能をテスト

    const request = new IncomingRequest('http://example.com');
    const ctx = createExecutionContext();
    const response = await worker.fetch(request, env, ctx);
    await waitOnExecutionContext(ctx);
    expect(await response.text()).toBe("期待する結果");

    1. インテグレーションテスト: SELF.fetch()を使用してワーカー全体をテスト

    const response = await SELF.fetch('https://example.com');
    expect(await response.text()).toBe("期待する結果");

    モックの活用

    R2バケットなどのCloudflareサービスをモック化することも重要です:

    const mockR2Bucket = {
      get: vi.fn(),
      put: vi.fn(),
      // その他必要なメソッド
    } as unknown as R2Bucket;
    
    // 環境変数に注入
    const env = {
      ...baseEnv,
      MY_BUCKET: mockR2Bucket,
    } as Env;

    まとめ

    Cloudflare WorkersのテストにおいてSELFバインディングを使用する場合は、poolOptions.workers.mainの設定が必須です。この設定を行うことで、よりリアルなインテグレーションテストが可能になります。ユニットテストとインテグレーションテストを組み合わせることで、ワーカーの品質を効果的に保証できます。

    テストはアプリケーション開発の重要な要素であり、Cloudflare Workersのような環境でも適切な設定と方法を用いることで効果的なテストが実現可能です。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark