← Cloudflare Workers / workers / testing / test-harness
Interakce s Workers
Testovací rámec použijte k odesílání požadavků přes nakonfigurované routy nebo k přímému cílení na konkrétní Worker. Můžete také vyvolávat události, například naplánované události.
Otestujte směrování tras napříč Workery
Když testovací framework spouští více Workerů, přidejte každý Worker do workers pole. První Worker je primární Worker. server.fetch() odesílá relativní URL adresy primárnímu Workeru a porovnává absolutní URL adresy s nakonfigurovanými trasami. Pokud žádná trasa neodpovídá, vrátí se zpět k primárnímu Workeru:
const server = createTestHarness({
workers: [
/** Includes `"routes": ["example.com/*"]` */
{ configPath: "./workers/web/wrangler.jsonc" },
/** Includes `"routes": ["api.example.com/v1/*"]` */
{ configPath: "./workers/api/wrangler.jsonc" },
],
});
const primaryResponse = await server.fetch("/");
const apiResponse = await server.fetch("http://api.example.com/v1/users/123");
const webResponse = await server.fetch("http://example.com/users/123");const server = createTestHarness({
workers: [
/** Includes `"routes": ["example.com/*"]` */
{ configPath: "./workers/web/wrangler.jsonc" },
/** Includes `"routes": ["api.example.com/v1/*"]` */
{ configPath: "./workers/api/wrangler.jsonc" },
],
});
const primaryResponse = await server.fetch("/");
const apiResponse = await server.fetch("http://api.example.com/v1/users/123");
const webResponse = await server.fetch("http://example.com/users/123");Interakce s konkrétním Workerem
Route dispatch testuje hranici aplikace, ale některé testy mohou chtít cílit na jeden Worker nebo vyvolat jiné obslužné rutiny událostí. Použijte server.getWorker(name) pro obejití porovnávání tras a získání handle pro daný Worker.
Tento handle Workeru pak můžete použít k přímému odesílání požadavků nebo k odesílání jiných událostí, například scheduled():
const apiWorker = server.getWorker("api-worker");
const response = await apiWorker.fetch("http://api.example.com/v1/users/123");
await apiWorker.scheduled({
cron: "0 0 * * *",
scheduledTime: new Date(),
});const apiWorker = server.getWorker("api-worker");
const response = await apiWorker.fetch("http://api.example.com/v1/users/123");
await apiWorker.scheduled({
cron: "0 0 * * *",
scheduledTime: new Date(),
});Ověření zaznamenaného chování
Testovací nástroj zachytává protokoly z Workers runtime. Chcete-li ověřit, že Worker zaznamenal konkrétní zprávu, použijte server.getLogs() pro načtení záznamů protokolu.
Zachycené logy se resetují při volání server.reset(). Můžete také volat server.clearLogs() k izolaci protokolů před a po konkrétní akci:
test("logs scheduled job results", async ({ expect }) => {
const apiWorker = server.getWorker("api-worker");
await apiWorker.scheduled({
cron: "0 0 * * *",
scheduledTime: new Date("2026-05-29T00:00:00.000Z"),
});
expect(server.getLogs()).toEqual([
expect.objectContaining({
level: "info",
message: "Generated daily report for 2026-05-29",
}),
]);
server.clearLogs();
await apiWorker.scheduled({
cron: "0 0 * * *",
scheduledTime: new Date("2026-05-30T00:00:00.000Z"),
});
expect(server.getLogs()).toEqual([
expect.objectContaining({
level: "info",
message: "Generated daily report for 2026-05-30",
}),
]);
});test("logs scheduled job results", async ({ expect }) => {
const apiWorker = server.getWorker("api-worker");
await apiWorker.scheduled({
cron: "0 0 * * *",
scheduledTime: new Date("2026-05-29T00:00:00.000Z"),
});
expect(server.getLogs()).toEqual([
expect.objectContaining({
level: "info",
message: "Generated daily report for 2026-05-29",
}),
]);
server.clearLogs();
await apiWorker.scheduled({
cron: "0 0 * * *",
scheduledTime: new Date("2026-05-30T00:00:00.000Z"),
});
expect(server.getLogs()).toEqual([
expect.objectContaining({
level: "info",
message: "Generated daily report for 2026-05-30",
}),
]);
});Sledujte a řiďte běh Workflow
Pokud váš Worker spouští Workflow, můžete použít worker.introspectWorkflow(bindingName) pro ovládání nových instancí a kontrolu jejich stavu.
const worker = server.getWorker("api-worker");
await using workflow = await worker.introspectWorkflow("MY_WORKFLOW");
await workflow.modifyAll(async (modifier) => {
await modifier.disableSleeps([{ name: "wait-for-approval" }]);
});
await worker.fetch("/start-workflow");
const [instance] = await workflow.get();
await instance.waitForStatus("complete");
expect(await instance.getOutput()).toEqual({ approved: true });const worker = server.getWorker<ApiEnv>("api-worker");
await using workflow = await worker.introspectWorkflow("MY_WORKFLOW");
await workflow.modifyAll(async (modifier) => {
await modifier.disableSleeps([{ name: "wait-for-approval" }]);
});
await worker.fetch("/start-workflow");
const [instance] = await workflow.get();
await instance.waitForStatus("complete");
expect(await instance.getOutput()).toEqual({ approved: true });Pokud test již zná ID instance, můžete danou instanci prozkoumat přímo pomocí worker.introspectWorkflowInstance(bindingName, instanceId).
const instance = await worker.introspectWorkflowInstance(
"MY_WORKFLOW",
"instance-id",
);
await instance.modify(async (modifier) => {
await modifier.mockStepResult({ name: "load-user" }, { id: "123" });
});
await instance.waitForStatus("complete");const instance = await worker.introspectWorkflowInstance(
"MY_WORKFLOW",
"instance-id",
);
await instance.modify(async (modifier) => {
await modifier.mockStepResult({ name: "load-user" }, { id: "123" });
});
await instance.waitForStatus("complete");