INTEGRITY Dokumentace

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]));