[ PROMPT_NODE_24154 ]
Miniflare 设计模式
[ SKILL_DOCUMENTATION ]
# 测试模式
## 选择测试方法
| 方法 | 使用场景 | 速度 | 设置难度 | 运行时 |
|----------|----------|-------|-------|---------|
| **getPlatformProxy** | 单元测试,逻辑测试 | 快 | 低 | Miniflare |
| **Miniflare API** | 集成测试,完全控制 | 中 | 中 | Miniflare |
| **vitest-pool-workers** | Vitest 运行器集成 | 中 | 中 | workerd |
**快速指南:**
- 单元测试 → getPlatformProxy
- 集成测试 → Miniflare API
- Vitest 工作流 → vitest-pool-workers
## getPlatformProxy
轻量级单元测试 - 提供绑定,无需完整的 Worker 运行时。
js
// vitest.config.js
export default { test: { environment: "node" } };
js
import { env } from "cloudflare:test";
import { describe, it, expect } from "vitest";
describe("业务逻辑", () => {
it("使用 KV 处理数据", async () => {
await env.KV.put("test", "value");
expect(await env.KV.get("test")).toBe("value");
});
});
**优点:** 快速、简单
**缺点:** 无完整运行时,无法测试 fetch 处理程序
## vitest-pool-workers
在 Vitest 中运行完整的 Workers 运行时。读取 `wrangler.toml`。
bash
npm i -D @cloudflare/vitest-pool-workers
js
// vitest.config.js
import { defineWorkersConfig } from "@cloudflare/vitest-pool-workers/config";
export default defineWorkersConfig({
test: {
poolOptions: { workers: { wrangler: { configPath: "./wrangler.toml" } } },
},
});
js
import { env, SELF } from "cloudflare:test";
import { it, expect } from "vitest";
it("处理 fetch", async () => {
const res = await SELF.fetch("http://example.com/");
expect(res.status).toBe(200);
});
**优点:** 完整运行时,使用 wrangler.toml
**缺点:** 需要 Wrangler 配置
## Miniflare API (node:test)
js
import assert from "node:assert";
import test, { after, before } from "node:test";
import { Miniflare } from "miniflare";
let mf;
before(() => {
mf = new Miniflare({ scriptPath: "src/index.js", kvNamespaces: ["TEST_KV"] });
});
test("fetch", async () => {
const res = await mf.dispatchFetch("http://localhost/");
assert.strictEqual(await res.text(), "Hello");
});
after(() => mf.dispose());
## 测试 Durable Objects 与事件
js
// Durable Objects
const ns = await mf.getDurableObjectNamespace("COUNTER");
const stub = ns.get(ns.idFromName("test-counter"));
await stub.fetch("http://localhost/increment");
// 直接存储
const storage = await mf.getDurableObjectStorage(ns.idFromName("test-counter"))