INTEGRITY Dokumentace

API

Wrangler nabízí rozhraní API pro programovou práci s vašimi Cloudflare Workers.

createTestHarness

createTestHarness() spustí jeden nebo více Workers pro integrační testy z libovolného test runneru pro Node.js. Spouští produkční výstup buildu z konfiguračních souborů Wrangler, konfiguračních souborů vygenerovaných Vite nebo z vložených konfiguračních objektů Wrangler. Toto API obaluje Miniflare a poskytuje metody pro odesílání requestů a naplánovaných událostí.

Pokyny k nastavení a příklady najdete v Nástroj pro integrační testování.

Syntaxe

import { createTestHarness } from "wrangler";

const server = createTestHarness(options);
import { createTestHarness } from "wrangler";

const server = createTestHarness(options);

Parametry

Každý WorkerInput umí načíst Worker z konfiguračního souboru Wrangler:

const server = createTestHarness({
	workers: [
		{ configPath: "./wrangler.web.jsonc" },
		{ configPath: "./wrangler.api.jsonc" },
	],
});
const server = createTestHarness({
	workers: [
		{ configPath: "./wrangler.web.jsonc" },
		{ configPath: "./wrangler.api.jsonc" },
	],
});

Vstupy konfiguračního souboru podporují tato pole:

Každý WorkerInput lze také použít config pro poskytnutí vloženého konfiguračního objektu Wrangler:

const server = createTestHarness({
	workers: [
		{
			config: {
				name: "api-worker",
				main: "src/api.ts",
				compatibility_date: "YYYY-MM-DD",
			},
		},
	],
});
const server = createTestHarness({
	workers: [
		{
			config: {
				name: "api-worker",
				main: "src/api.ts",
				compatibility_date: "YYYY-MM-DD",
			},
		},
	],
});

Návratový typ

createTestHarness() vrací TestHarness objekt s těmito metodami:

getWorker(name?) vrací WorkerHandle objekt s těmito metodami:

Použití

Tento příklad používá vestavěný test runner Node.js:

import assert from "node:assert/strict";
import { after, afterEach, before, describe, test } from "node:test";
import { createTestHarness } from "wrangler";

const server = createTestHarness({
	workers: [
		{ configPath: "./wrangler.web.jsonc" },
		{ configPath: "./wrangler.api.jsonc" },
	],
});

const apiWorker = server.getWorker("api-worker");

describe("Worker", () => {
	before(async () => {
		await server.listen();
	});

	afterEach(async () => {
		await server.reset();
	});

	after(async () => {
		await server.close();
	});

	test("dispatches through configured routes", async () => {
		const response = await server.fetch("http://example.com/users/123");
		assert.equal(response.status, 200);
	});

	test("calls a specific Worker directly", async () => {
		const response = await apiWorker.fetch(
			"http://api.example.com/v1/users/123",
		);
		assert.equal(response.status, 200);
	});

	test("triggers a scheduled handler", async () => {
		const result = await apiWorker.scheduled({
			cron: "0 0 * * *",
			scheduledTime: new Date(),
		});
		assert.equal(result.outcome, "ok");
	});
});
import assert from "node:assert/strict";
import { after, afterEach, before, describe, test } from "node:test";
import { createTestHarness } from "wrangler";

const server = createTestHarness({
	workers: [
		{ configPath: "./wrangler.web.jsonc" },
		{ configPath: "./wrangler.api.jsonc" },
	],
});

const apiWorker = server.getWorker("api-worker");

describe("Worker", () => {
	before(async () => {
		await server.listen();
	});

	afterEach(async () => {
		await server.reset();
	});

	after(async () => {
		await server.close();
	});

	test("dispatches through configured routes", async () => {
		const response = await server.fetch("http://example.com/users/123");
		assert.equal(response.status, 200);
	});

	test("calls a specific Worker directly", async () => {
		const response = await apiWorker.fetch(
			"http://api.example.com/v1/users/123",
		);
		assert.equal(response.status, 200);
	});

	test("triggers a scheduled handler", async () => {
		const result = await apiWorker.scheduled({
			cron: "0 0 * * *",
			scheduledTime: new Date(),
		});
		assert.equal(result.outcome, "ok");
	});
});

experimental_generateTypes

Vygenerujte definice typů TypeScript z konfigurace Workeru. Toto API využívá stejnou základní logiku jako wrangler types příkaz CLI, takže výstupy zůstávají shodné mezi CLI a programovým API.

Na rozdíl od příkazu CLI experimental_generateTypes automaticky nezapisuje na disk. Místo toho vrací vygenerovaný obsah typů jako strukturované řetězce, se kterými můžete dále pracovat podle potřeby.

Syntaxe

import { experimental_generateTypes } from "wrangler";

const result = await experimental_generateTypes(options);

Parametry

Návratový typ

experimental_generateTypes() vrací Promise která se přeloží na objekt obsahující následující pole:

Použití

Můžete použít experimental_generateTypes abyste vygenerovali typy programově, sami je zapsali na disk, nebo je předali jiným nástrojům:

import { experimental_generateTypes } from "wrangler";
import * as fs from "node:fs";

const result = await experimental_generateTypes({
	config: "wrangler.json",
	includeRuntime: true,
	includeEnv: true,
});

// Write the combined content to the path specified in options
fs.writeFileSync(result.path, result.content, "utf-8");

Chcete-li vygenerovat pouze typy env bez typů runtime:

const result = await experimental_generateTypes({
	includeRuntime: false,
});

Chcete-li vygenerovat typy pro konkrétní prostředí s vlastním názvem rozhraní:

const result = await experimental_generateTypes({
	env: "staging",
	envInterface: "StagingEnv",
	path: "./types/staging.d.ts",
});

unstable_startWorker

Toto API zpřístupňuje vnitřní fungování vývojového serveru Wrangler a umožňuje přizpůsobit způsob jeho spuštění. Můžete například použít unstable_startWorker() pro spuštění integračních testů proti vašemu Workeru. Tento příklad používá node:test, ale mělo by to platit pro jakýkoli testovací framework:

import assert from "node:assert";
import test, { after, before, describe } from "node:test";
import { unstable_startWorker } from "wrangler";

describe("worker", () => {
	let worker;

	before(async () => {
		worker = await unstable_startWorker({ config: "wrangler.json" });
	});

	test("hello world", async () => {
		assert.strictEqual(
			await (await worker.fetch("http://example.com")).text(),
			"Hello world",
		);
	});

	after(async () => {
		await worker.dispose();
	});
});

unstable_dev

Spusťte HTTP server pro testování Workeru.

Po zavolání unstable_dev vrátí fetch() funkce pro volání vašeho Workeru bez nutnosti znát adresu nebo port, a také stop() funkci pro vypnutí serveru HTTP.

Standardně unstable_dev provede integrační testy proti lokálnímu serveru. Pokud chcete provést e2e test proti preview Workeru, předejte local: false v options objekt při volání unstable_dev() funkci. Upozorňujeme, že testy e2e mohou být výrazně pomalejší než integrační testy.

Konstruktor

const worker = await unstable_dev(script, options);

Parametry

Návratový typ

unstable_dev() vrací objekt obsahující tyto metody:

Použití

Při spouštění každé testovací sady použijte beforeAll() funkci pro spuštění unstable_dev(). beforeAll() funkce se používá ke snížení režie: spuštění vývojového serveru trvá několik set milisekund, spouštění a zastavování pro každý jednotlivý test se rychle sčítá a zpomaluje vaše testy.

V každém testovacím případě volejte await worker.fetch(), a ověření, že odpověď odpovídá očekávání.

Chcete-li ukončit sadu testů, zavolejte await worker.stop() v afterAll .

Příklad s jedním Workerem

const { unstable_dev } = require("wrangler");

describe("Worker", () => {
	let worker;

	beforeAll(async () => {
		worker = await unstable_dev("src/index.js", {
			experimental: { disableExperimentalWarning: true },
		});
	});

	afterAll(async () => {
		await worker.stop();
	});

	it("should return Hello World", async () => {
		const resp = await worker.fetch();
		const text = await resp.text();
		expect(text).toMatchInlineSnapshot(`"Hello World!"`);
	});
});
import { unstable_dev } from "wrangler";
import type { UnstableDevWorker } from "wrangler";

describe("Worker", () => {
	let worker: UnstableDevWorker;

	beforeAll(async () => {
		worker = await unstable_dev("src/index.ts", {
			experimental: { disableExperimentalWarning: true },
		});
	});

	afterAll(async () => {
		await worker.stop();
	});

	it("should return Hello World", async () => {
		const resp = await worker.fetch();
		const text = await resp.text();
		expect(text).toMatchInlineSnapshot(`"Hello World!"`);
	});
});

Příklad s více Workers

Můžete testovat Workery, které volají jiné Workery. V příkladu níže označujeme Worker, který volá jiné Workery, jako rodičovský Worker, a volaný Worker jako dětský Worker.

Pokud podřízený Worker ukončíte předčasně, nadřazený Worker se o jeho existenci nedozví a testy selžou.

import { unstable_dev } from "wrangler";

describe("multi-worker testing", () => {
	let childWorker;
	let parentWorker;

	beforeAll(async () => {
		childWorker = await unstable_dev("src/child-worker.js", {
			config: "src/child-wrangler.toml",
			experimental: { disableExperimentalWarning: true },
		});
		parentWorker = await unstable_dev("src/parent-worker.js", {
			config: "src/parent-wrangler.toml",
			experimental: { disableExperimentalWarning: true },
		});
	});

	afterAll(async () => {
		await childWorker.stop();
		await parentWorker.stop();
	});

	it("childWorker should return Hello World itself", async () => {
		const resp = await childWorker.fetch();
		const text = await resp.text();
		expect(text).toMatchInlineSnapshot(`"Hello World!"`);
	});

	it("parentWorker should return Hello World by invoking the child worker", async () => {
		const resp = await parentWorker.fetch();
		const parsedResp = await resp.text();
		expect(parsedResp).toEqual("Parent worker sees: Hello World!");
	});
});
import { unstable_dev } from "wrangler";
import type { UnstableDevWorker } from "wrangler";

describe("multi-worker testing", () => {
	let childWorker: UnstableDevWorker;
	let parentWorker: UnstableDevWorker;

	beforeAll(async () => {
		childWorker = await unstable_dev("src/child-worker.js", {
			config: "src/child-wrangler.toml",
			experimental: { disableExperimentalWarning: true },
		});
		parentWorker = await unstable_dev("src/parent-worker.js", {
			config: "src/parent-wrangler.toml",
			experimental: { disableExperimentalWarning: true },
		});
	});

	afterAll(async () => {
		await childWorker.stop();
		await parentWorker.stop();
	});

	it("childWorker should return Hello World itself", async () => {
		const resp = await childWorker.fetch();
		const text = await resp.text();
		expect(text).toMatchInlineSnapshot(`"Hello World!"`);
	});

	it("parentWorker should return Hello World by invoking the child worker", async () => {
		const resp = await parentWorker.fetch();
		const parsedResp = await resp.text();
		expect(parsedResp).toEqual("Parent worker sees: Hello World!");
	});
});

getPlatformProxy

getPlatformProxy funkce poskytuje způsob, jak získat objekt obsahující proxy (na lokální workerd bindingy) a emulace hodnot specifických pro Cloudflare Workers, což umožňuje jejich emulaci v procesu Node.js.

Jedním z běžných případů použití platform proxy je emulace bindings v aplikacích cílených na Workers, které ale běží mimo Workers runtime (například lokální vývojové servery frameworků běžící v Node.js), nebo pro účely testování (například ověření, že kód správně komunikuje s daným typem bindingu).

Syntaxe

const platform = await getPlatformProxy(options);

Parametry

Návratový typ

getPlatformProxy() vrací Promise která se přeloží na objekt obsahující následující pole.

Použití

getPlatformProxy funkce používá vazby nalezené v Konfigurační soubor Wrangler. Například pokud máte proměnná prostředí konfigurace nastavená v konfiguračním souboru Wrangler:

{
	"vars": {
		"MY_VARIABLE": "test"
	}
}
[vars]
MY_VARIABLE = "test"

K bindings můžete přistupovat importem getPlatformProxy takto:

import { getPlatformProxy } from "wrangler";

const { env } = await getPlatformProxy();

Pro přístup k hodnotě MY_VARIABLE binding přidejte do svého kódu následující:

console.log(`MY_VARIABLE = ${env.MY_VARIABLE}`);

Tímto se vypíše následující výstup: MY_VARIABLE = test.

Podporované vazby

Všechny podporované vazby (bindings) nalezené ve vašem Konfigurační soubor Wrangler jsou vám k dispozici prostřednictvím env.

Bindings podporované getPlatformProxy jsou: