← Cloudflare Workers / workers / testing / test-harness
Nakonfigurujte testovací harness
createTestHarness() spouští jeden nebo více Workerů na jediném lokálním serveru. Každý Worker může pocházet z projektu Wrangler nebo z projektu Vite, který používá Cloudflare Vite plugin.
Nakonfigurujte projekty Workerů
Nasměrujte každou položku v workers pole do konfiguračního souboru Wrangleru pro projekt:
const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc" }],
});const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc" }],
});U Workers vytvořených pomocí Cloudflare Vite plugin, spusťte vite build nejprve, aby testy použily výstup produkčního sestavení:
npx vite buildVygenerovaná konfigurace Wrangleru funguje stejně jako jakákoli jiná configPath. Každý Worker je nakonfigurován samostatně, takže jeden testovací rámec dokáže spustit oba typy projektů:
const server = createTestHarness({
workers: [
// Wrangler project
{ configPath: "./workers/api/wrangler.jsonc" },
// Vite project (built output from the Cloudflare Vite plugin)
{ configPath: "./dist/web_worker/wrangler.json" },
],
});const server = createTestHarness({
workers: [
// Wrangler project
{ configPath: "./workers/api/wrangler.jsonc" },
// Vite project (built output from the Cloudflare Vite plugin)
{ configPath: "./dist/web_worker/wrangler.json" },
],
});Vyberte prostředí Wrangler
Ve výchozím nastavení testovací framework načte nejvyšší úroveň konfigurace Wrangler. Nastavte env pokud chcete z konfigurace načíst konkrétní prostředí.
const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc", env: "test" }],
});const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc", env: "test" }],
});Přepsání proměnných a secrets
Můžete přepsat vars a secrets pro každého Workera v harnessu, pokud se chcete vyhnout vytváření samostatného prostředí Wrangler pro testování.
const server = createTestHarness({
workers: [
{
configPath: "./wrangler.jsonc",
vars: { API_HOST: "http://identity.example.com" },
secrets: { API_TOKEN: "test-token" },
},
],
});const server = createTestHarness({
workers: [
{
configPath: "./wrangler.jsonc",
vars: { API_HOST: "http://identity.example.com" },
secrets: { API_TOKEN: "test-token" },
},
],
});Nakonfigurujte harness po nastavení
Pokud část konfigurace Workeru závisí na nastavení testu, můžete zavolat createTestHarness() bez možností a nakonfigurujte testovací rámec pomocí server.update() před spuštěním serveru.
const server = createTestHarness();
let upstream;
beforeAll(async () => {
upstream = await startLocalApi();
await server.update({
workers: [
{
configPath: "./wrangler.jsonc",
vars: { API_HOST: upstream.url },
},
],
});
await server.listen();
});
afterAll(async () => {
await server.close();
await upstream.close();
});const server = createTestHarness();
let upstream: { url: string; close(): Promise<void> };
beforeAll(async () => {
upstream = await startLocalApi();
await server.update({
workers: [
{
configPath: "./wrangler.jsonc",
vars: { API_HOST: upstream.url },
},
],
});
await server.listen();
});
afterAll(async () => {
await server.close();
await upstream.close();
});Resetujte harness mezi jednotlivými testy
Při opakovaném použití serveru napříč testy zavolejte server.reset() po každém testu. Znovu vytvoří lokální úložiště a obnoví Workers na možnosti použité při spuštění aktuální relace.
const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc" }],
});
afterEach(async () => {
await server.reset();
});const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc" }],
});
afterEach(async () => {
await server.reset();
});Po resetování znovu proveďte veškeré potřebné migrace schématu a znovu vložte počáteční data. Příklady najdete v Připravte stav testu.
Vypsat ladicí výstup při selhání testů
server.debug() vypíše časovou osu serveru a zachycené protokoly runtime Workers. Zavolejte ji, když test vyvolá výjimku nebo selže a potřebujete více informací k ladění.
Následující příklad používá cleanup hook z Vitest:
const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc" }],
});
afterEach(({ task }) => {
if (task.result?.state === "fail") {
server.debug();
}
});const server = createTestHarness({
workers: [{ configPath: "./wrangler.jsonc" }],
});
afterEach(({ task }) => {
if (task.result?.state === "fail") {
server.debug();
}
});Zadejte typy pro handlery Workeru
server.getWorker() přijímá typy pro prostředí Workeru a exporty modulů. Tyto typy můžete definovat ručně. Pokud je ale chcete udržet v souladu s vaším Workerem, můžete typ env vygenerovat z konfigurace Wrangleru a exporty odvodit z jeho zdrojového modulu.
Každému Workeru přiřaďte odlišné rozhraní prostředí, aby bylo možné vygenerované deklarace používat společně:
npx wrangler types ./workers/api/worker-configuration.d.ts --config ./workers/api/wrangler.jsonc --env-interface ApiEnvTento příkaz zopakujte pro každý Worker a vygenerované soubory zahrňte do konfigurace TypeScriptu pro vaše testy:
{
"include": ["./workers/*/worker-configuration.d.ts", "./tests/**/*.ts"]
}Předejte vygenerované rozhraní prostředí do server.getWorker(). Použijte typeof import() pro odvození exportů Workeru z jeho zdrojového modulu:
const apiWorker = server.getWorker("api-worker");const apiWorker = server.getWorker<
ApiEnv,
typeof import("../workers/api/index")
>("api-worker");V tomto příkladu ApiEnv pochází z worker-configuration.d.ts. Typ modulu zahrnuje výchozí export a jeho RPC metody. Znovu spusťte wrangler types při změně konfigurace Workeru.