コンテンツにスキップ

設定

Workers Vitest統合は、Vitestの通常のオプションに追加の設定を提供します。Workers Vitest統合を設定するには、poolOptions.workersキーを使用します。型チェックと補完のために、@cloudflare/vitest-pool-workers/configモジュールからdefineWorkersConfig()関数を使用してください。

設定の例は次のとおりです:

import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config";
export default defineWorkersConfig({
test: {
poolOptions: {
workers: {
wrangler: {
configPath: "./wrangler.toml"
},
},
},
},
});

関数

以下の関数は、@cloudflare/vitest-pool-workers/configモジュールからエクスポートされています。

  • defineWorkersConfig(options:UserConfig & { test?: { poolOptions?: { workers?: WorkersPoolOptions | ((ctx: WorkerPoolOptionsContext) => Awaitable\<WorkersPoolOptions>) } } })

    • Vitestが正しいモジュール解決設定でWorkers統合を使用するように構成されていることを確認し、WorkersPoolOptionsの型チェックを提供します。これは、VitestのdefineConfig()関数の代わりに使用する必要があります。defineWorkersConfig()関数は、optionsPromiseまたはoptionsを返すオプションのasync関数も受け入れます。
  • defineWorkersProject(options:UserWorkspaceConfig & { test?: { poolOptions?: { workers?: WorkersPoolOptions | ((ctx: WorkerPoolOptionsContext) => Awaitable\<WorkersPoolOptions>) } } })

    • Vitestが正しいモジュール解決設定でWorkers統合を使用するように構成されていることを確認し、WorkersPoolOptionsの型チェックを提供します。これは、VitestのdefineProject()関数の代わりに使用する必要があります。defineWorkersProject()関数は、optionsPromiseまたはoptionsを返すオプションのasync関数も受け入れます。
  • readD1Migrations(migrationsPath:string): D1Migration[]

    • migrationsPathに保存されているすべてのD1マイグレーションを読み取り、マイグレーション番号で順序付けて返します。各マイグレーションは、その内容を個々のSQLクエリの配列に分割します。マイグレーションを適用するには、テストまたはセットアップファイル内でapplyD1Migrations()関数を呼び出してください。マイグレーションを使用したプロジェクトの例については、D1レシピを参照してください。

WorkersPoolOptions

  • main: stringoptional

    • テストと同じアイソレート/コンテキストで実行されるWorkerへのエントリポイント。このオプションは、統合テストのためにimport { SELF } from "cloudflare:test"を使用する場合や、クラスが同じWorker内で定義されている場合に明示的なscriptNameなしでDurable Objectsを使用するために必要です。このファイルはViteの変換を通過し、TypeScriptである可能性があります。テスト内でimport module from "<path-to-main>"を使用すると、SELFおよびDurable Objectバインディングに内部で使用されるのとまったく同じmoduleインスタンスが得られます。wrangler.configPathが定義されていて、このオプションが定義されていない場合は、その設定ファイルのmainフィールドから読み取られます。
  • isolatedStorage: booleanoptional

    • テストごとのアイソレートストレージを有効にします。これが有効になっている場合、テスト内で行われたストレージへの書き込みは、テストの終了時に元に戻されます。テストのストレージ環境は、含まれているスイートからコピーされるため、beforeAll()フックを使用してデータをシードできます。このオプションが無効になっている場合、すべてのテストは同じストレージを共有します。アイソレートストレージが有効な場合、.concurrentテストはサポートされていません。アイソレーションモデルに関する詳細については、Isolation and concurrencyを参照してください。

    • デフォルトはtrueです。

      import { env } from "cloudflare:test";
      import { beforeAll, beforeEach, describe, test, expect } from "vitest";
      // KV名前空間に保存されている現在のリストを取得
      async function get(): Promise<string[]> {
      return await env.NAMESPACE.get("list", "json") ?? [];
      }
      // リストの末尾にアイテムを追加
      async function append(item: string) {
      const value = await get();
      value.push(item);
      await env.NAMESPACE.put("list", JSON.stringify(value));
      }
      beforeAll(() => append("all"));
      beforeEach(() => append("each"));
      test("one", async () => {
      // 各テストは親からコピーされた独自のストレージ環境を取得
      await append("one");
      expect(await get()).toStrictEqual(["all", "each", "one"]);
      });
      // `append("each")`と`append("one")`は元に戻される
      test("two", async () => {
      await append("two");
      expect(await get()).toStrictEqual(["all", "each", "two"]);
      });
      // `append("each")`と`append("two")`は元に戻される
      describe("describe", async () => {
      beforeAll(() => append("describe all"));
      beforeEach(() => append("describe each"));
      test("three", async () => {
      await append("three");
      expect(await get()).toStrictEqual([
      // すべての`beforeAll()`は`beforeEach()`の前に実行される
      "all", "describe all", "each", "describe each", "three"
      ]);
      });
      // `append("each")`、`append("describe each")`、`append("three")`は元に戻される
      test("four", async () => {
      await append("four");
      expect(await get()).toStrictEqual([
      "all", "describe all", "each", "describe each", "four"
      ]);
      });
      // `append("each")`、`append("describe each")`、`append("four")`は元に戻される
      });
  • singleWorker: booleanoptional

    • このプロジェクト内のすべてのテストを同じWorker内で直列に実行し、同じモジュールキャッシュを使用します。これにより、小さなテストファイルが多数ある場合に実行速度が大幅に向上する可能性があります。アイソレーションモデルに関する詳細については、Isolation and concurrencyページを参照してください。

    • デフォルトはfalseです。

  • miniflare: SourcelessWorkerOptions & { workers?: WorkerOptions\[]; } optional

    • これは、bindingscompatibility dates、およびcompatibility flagsなど、通常Wrangler設定ファイル内に保存される構成情報を提供するために使用します。WorkerOptionsインターフェースはこちらで定義されています。エントリポイントを設定するには、上記のmainオプションを使用し、MiniflareのscriptscriptPath、またはmodulesオプションは使用しないでください。

    • プロジェクトが複数のWorkersを使用する場合、テストと同じworkerdプロセス内で実行され、バインドできる補助Workersを構成できます。補助Workersは、通常のMiniflareWorkerOptionsオブジェクトを含むworkers配列を使用して構成されます。main Workerとは異なり、補助Workersは次のことができません:

      • TypeScriptエントリポイントを持つことはできません。補助Workersは最初にJavaScriptにコンパイルする必要があります。これには、wrangler deploy --dry-run --outdir distコマンドを使用できます。
      • 通常のWorkersモジュール解決セマンティクスを使用します。詳細については、Isolation and concurrencyページを参照してください。
      • cloudflare:testモジュールにアクセスできません。
      • 特定の互換性日付やフラグを必要としません。
      • Service Worker構文で記述できます。
      • テスト内で定義されたグローバルモックの影響を受けません。
  • wrangler: { configPath?: string; environment?: string; } optional

    • main互換性設定およびbindingsを読み込むためのWrangler設定ファイルへのパス。これらのオプションは、上記のminiflareオプションとマージされ、miniflareの値が優先されます。たとえば、Wrangler設定でSERVICEという名前のサービスバインディングをWorker名serviceに定義している場合、miniflareオプションにserviceBindings: { SERVICE(request) { return new Response("body"); } }を含めると、テスト内のSERVICEへのすべてのリクエストはbodyを返します。configPath.tomlおよび.jsonファイルの両方を受け入れます。

    • 環境オプションは、バインディングや変数を取得するためにWrangler環境を指定するために使用できます。

WorkersPoolOptionsContext

  • inject: typeof import(“vitest”).inject

    • テスト内で通常vitestモジュールからインポートされる同じinject()関数。これにより、globalSetupスクリプトから注入された値に基づいてminiflare構成を定義できます。これは、実行時にのみ知られる動的に生成された値が構成にある場合に使用します。たとえば、グローバルセットアップスクリプトは、ランダムなポートで上流サーバーを起動するかもしれません。このポートはprovide()され、その後外部サービスバインディングやHyperdriveの構成でinject()される可能性があります。このprovide/injectアプローチを使用したプロジェクトの例については、Hyperdriveレシピを参照してください。

      env.d.ts
      declare module "vitest" {
      interface ProvidedContext {
      port: number;
      }
      }
      // global-setup.ts
      import type { GlobalSetupContext } from "vitest/node";
      export default function ({ provide }: GlobalSetupContext) {
      // Node.js内で実行され、ここでサーバーを起動することができます...
      provide("port", 1337);
      return () => { /* ...その後、ここでテアダウン */ };
      }
      // vitest.config.ts
      import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config";
      export default defineWorkersConfig({
      test: {
      globalSetup: ["./global-setup.ts"],
      pool: "@cloudflare/vitest-pool-workers",
      poolOptions: {
      workers: ({ inject }) => ({
      miniflare: {
      hyperdrives: {
      DATABASE: `postgres://user:pass@example.com:${inject("port")}/db`,
      },
      },
      }),
      },
      },
      });

SourcelessWorkerOptions

scriptscriptPath、またはmodulesプロパティを持たないSourceless WorkerOptions型。詳細については、MiniflareのWorkerOptions型を参照してください。

type SourcelessWorkerOptions = Omit<
WorkerOptions,
"script" | "scriptPath" | "modules" | "modulesRoot"
>;