@msw/cloudflare ↗ を使うと、@cloudflare/vitest-plugin で送信 HTTP リクエストと WebSocket リクエストをモックできます。この連携は、Worker がエクスポートしたハンドラーを呼ぶユニットテストと、exports.default.fetch() を呼ぶ統合テストの両方に対応します。
Mock Service Worker (MSW) のバージョン 2.14 以降と、Cloudflare 連携パッケージをインストールします。
npm i -D msw@^2.14.0 @msw/cloudflareyarn add -D msw@^2.14.0 @msw/cloudflarepnpm add -D msw@^2.14.0 @msw/cloudflarebun add -d msw@^2.14.0 @msw/cloudflareテスト用の共有ネットワークモックを作成します。
import { setupNetwork } from "@msw/cloudflare";
export const network = setupNetwork();import { setupNetwork } from "@msw/cloudflare";
export const network = setupNetwork();Vitest のセットアップファイルで、テスト開始前にモックを有効にし、各テストのあとでハンドラーをリセットし、テスト終了後に停止します。
import { afterAll, afterEach, beforeAll } from "vitest";
import { network } from "./network";
beforeAll(() => network.enable());
afterEach(() => network.resetHandlers());
afterAll(() => network.disable());import { afterAll, afterEach, beforeAll } from "vitest";
import { network } from "./network";
beforeAll(() => network.enable());
afterEach(() => network.resetHandlers());
afterAll(() => network.disable());Vitest の設定で、setupFiles 配列にこのセットアップファイルを追加します。
network.use() と MSW のリクエストハンドラーで、送信リクエストに対するレスポンスを返します。次の例は、外部 API から挨拶を取得する Worker をテストします。
export default {
async fetch() {
return fetch("https://api.example.com/greeting");
},
};export default {
async fetch(): Promise<Response> {
return fetch("https://api.example.com/greeting");
},
} satisfies ExportedHandler;import {
createExecutionContext,
waitOnExecutionContext,
} from "cloudflare:test";
import { env } from "cloudflare:workers";
import { http, HttpResponse } from "msw";
import { expect, it } from "vitest";
import worker from "../src";
import { network } from "./network";
it("mocks an outbound request", async () => {
network.use(
http.get("https://api.example.com/greeting", () => {
return HttpResponse.json({ message: "Hello" });
}),
);
const ctx = createExecutionContext();
const response = await worker.fetch(
new Request("https://example.com"),
env,
ctx,
);
await waitOnExecutionContext(ctx);
expect(await response.json()).toEqual({ message: "Hello" });
});import { createExecutionContext, waitOnExecutionContext } from "cloudflare:test";
import { env } from "cloudflare:workers";
import { http, HttpResponse } from "msw";
import { expect, it } from "vitest";
import worker from "../src";
import { network } from "./network";
it("mocks an outbound request", async () => {
network.use(
http.get("https://api.example.com/greeting", () => {
return HttpResponse.json({ message: "Hello" });
}),
);
const ctx = createExecutionContext();
const response = await worker.fetch(
new Request("https://example.com"),
env,
ctx,
);
await waitOnExecutionContext(ctx);
expect(await response.json()).toEqual({ message: "Hello" });
});Worker が作成する WebSocket 接続は、MSW の ws.link() API でモックできます。request-mocking フィクスチャ ↗ には、HTTP、exports.default.fetch()、WebSocket の例があります。