← Cloudflare Workers / workers / testing / test-harness
Připravte stav testu
Integrační test může před spuštěním potřebovat data v lokálním úložišti. Může být také závislý na externích službách, které během testu nechcete volat. K přípravě tohoto stavu a nahrazení těchto závislostí použijte testovací rámec.
Přístup k nakonfigurovaným bindings
worker.getEnv() vrací proměnné, tajné klíče a vazby nakonfigurované pro Worker. Můžete určit typy pro server.getWorker() aby tyto hodnoty měly typ. Poté pomocí vrácených storage bindings naplňte data přímo z testu:
const apiWorker = server.getWorker("api-worker");
const env = await apiWorker.getEnv();
await env.USERS.put("123", JSON.stringify({ name: "Ada" }));const apiWorker = server.getWorker<ApiEnv>("api-worker");
const env = await apiWorker.getEnv();
await env.USERS.put("123", JSON.stringify({ name: "Ada" }));Aplikovat migrace D1
Použijte worker.applyD1Migrations(bindingName) pro čtení nastavení migrací pro D1 binding z konfigurace Wrangler. Používá nakonfigurovaný migrations_dir a migrations_pattern. Bez těchto možností se čte .sql soubory z migrations adresář relativně ke konfiguračnímu souboru.
Zavolejte ji po resetování úložiště, abyste použili migrace, které ještě neproběhly. Poté přistupte k databázi pomocí worker.getEnv() a naplňte potřebné řádky výchozími daty.
const apiWorker = server.getWorker("api-worker");
beforeEach(async () => {
await apiWorker.applyD1Migrations("DATABASE");
const env = await apiWorker.getEnv();
await env.DATABASE.prepare(
"INSERT INTO daily_reports (date, user_ids) VALUES (?, ?)",
)
.bind("2026-05-29", JSON.stringify(["123", "456"]))
.run();
});const apiWorker = server.getWorker<ApiEnv>("api-worker");
beforeEach(async () => {
await apiWorker.applyD1Migrations("DATABASE");
const env = await apiWorker.getEnv();
await env.DATABASE.prepare(
"INSERT INTO daily_reports (date, user_ids) VALUES (?, ?)",
)
.bind("2026-05-29", JSON.stringify(["123", "456"]))
.run();
});Připravte úložiště Durable Object
worker.getDurableObjectStorage() vám dává přístup k úložišti instance Durable Object využívající SQLite. Zadejte název její vazby nebo název exportované třídy. Poté vyberte instanci podle názvu nebo ID.
Vrácený handle spouští SQL uvnitř Durable Object. Použijte jej k naplnění instance daty před testem nebo ke kontrole jejího stavu po spuštění Workeru.
const worker = server.getWorker("api-worker");
const storage = await worker.getDurableObjectStorage("COUNTER", {
name: "user-123",
});
await storage.exec(
"INSERT INTO counters (id, value) VALUES (?, ?)",
"user-123",
0,
);
await worker.fetch("/counter/user-123");
const rows = await storage.exec(
"SELECT value FROM counters WHERE id = ?",
"user-123",
);
expect(rows).toEqual([{ value: 1 }]);const worker = server.getWorker<ApiEnv>("api-worker");
const storage = await worker.getDurableObjectStorage("COUNTER", {
name: "user-123",
});
await storage.exec(
"INSERT INTO counters (id, value) VALUES (?, ?)",
"user-123",
0,
);
await worker.fetch("/counter/user-123");
const rows = await storage.exec<{ value: number }>(
"SELECT value FROM counters WHERE id = ?",
"user-123",
);
expect(rows).toEqual([{ value: 1 }]);Mockování odchozích požadavků
Testovací nástroj funguje jako proxy pro odchozí fetch() požadavky z vašich Workerů prostřednictvím globalThis.fetch() funkci ve vašem prostředí Node. To vám umožní tyto požadavky zachytit a ve vašich testech vracet předvídatelnou odpověď.
Následující příklad používá vi.spyOn() k mockování jednoho požadavku. Můžete ale také použít Mock Service Worker (MSW) k zachycení těchto požadavků podle vašich preferencí.
import { afterEach, test, vi } from "vitest";
afterEach(() => {
vi.restoreAllMocks();
});
test("loads a user profile", async ({ expect }) => {
vi.spyOn(globalThis, "fetch").mockImplementation(async (input, init) => {
const request = new Request(input, init);
if (request.url === "http://identity.example.com/profile/123") {
return Response.json({ id: "123", name: "Ada" });
}
throw new Error(`Unexpected request: ${request.method} ${request.url}`);
});
const worker = server.getWorker();
const response = await worker.fetch("/users/123");
expect(await response.json()).toEqual({ id: "123", name: "Ada" });
});import { afterEach, test, vi } from "vitest";
afterEach(() => {
vi.restoreAllMocks();
});
test("loads a user profile", async ({ expect }) => {
vi.spyOn(globalThis, "fetch").mockImplementation(async (input, init) => {
const request = new Request(input, init);
if (request.url === "http://identity.example.com/profile/123") {
return Response.json({ id: "123", name: "Ada" });
}
throw new Error(`Unexpected request: ${request.method} ${request.url}`);
});
const worker = server.getWorker();
const response = await worker.fetch("/users/123");
expect(await response.json()).toEqual({ id: "123", name: "Ada" });
});Mockování vazeb pomocí testovacích Workers
Použijte bindingOverrides když chcete řídit chování bindingu. Směruje binding na testovací Worker běžící uvnitř harness. Testovací Worker může například nahradit binding Browser Rendering a vrátit známý screenshot bez spuštění prohlížeče.
Testovací Worker může také zveřejnit metody JSRPC, které nastavují jeho chování. Použijte worker.getExport() pro přístup k výchozímu exportu z vašeho testu.
const server = createTestHarness({
workers: [
{
configPath: "./workers/web/wrangler.jsonc",
bindingOverrides: { BROWSER: "mock-browser" },
},
// The test Worker (mock-browser) that replaces the Browser Rendering binding
{ configPath: "./workers/mock-browser/wrangler.jsonc" },
],
});
// Access the test Worker to configure its behavior or assert its state.
const mockBrowser = await server.getWorker("mock-browser").getExport();
// Configure the screenshot to be returned through the overridden binding.
await mockBrowser.setScreenshot([137, 80, 78, 71]);
const response = await server.fetch("/reports/2026-05-29.png");
expect(await response.bytes()).toEqual(Uint8Array.from([137, 80, 78, 71]));const server = createTestHarness({
workers: [
{
configPath: "./workers/web/wrangler.jsonc",
bindingOverrides: { BROWSER: "mock-browser" },
},
// The test Worker (mock-browser) that replaces the Browser Rendering binding
{ configPath: "./workers/mock-browser/wrangler.jsonc" },
],
});
// Access the test Worker to configure its behavior or assert its state.
const mockBrowser = await server
.getWorker<unknown, typeof import("../workers/mock-browser")>("mock-browser")
.getExport();
// Configure the screenshot to be returned through the overridden binding.
await mockBrowser.setScreenshot([137, 80, 78, 71]);
const response = await server.fetch("/reports/2026-05-29.png");
expect(await response.bytes()).toEqual(Uint8Array.from([137, 80, 78, 71]));