如何在Deno测试中实例化FetchEvent?
如何在Deno测试中实例化FetchEvent?
嘿,我之前也踩过这个坑!在Deno的默认测试环境里直接实例化FetchEvent会报ReferenceError,这是因为FetchEvent属于浏览器/Web Worker专属的API,Deno的主测试上下文并没有自动暴露它。不过有两个实用的解决办法:
方法一:在Worker环境中运行测试
既然FetchEvent本来就是为Service Worker(属于Web Worker体系)设计的API,那我们直接让测试在Worker线程里跑就好啦。Deno的测试API支持指定worker: true选项,开启后测试代码就能访问到完整的Web Worker API,包括FetchEvent。
举个实际的测试代码例子:
import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts"; Deno.test({ name: "验证FetchEvent实例化", worker: true, // 核心配置:让测试在Worker环境执行 async fn() { // 现在可以正常创建FetchEvent实例了 const fetchEvent = new FetchEvent("fetch", { request: new Request("https://example.com"), preloadResponse: Promise.resolve(new Response("测试响应")), }); // 做你需要的断言测试 assertEquals(fetchEvent.type, "fetch"); assertEquals(fetchEvent.request.url, "https://example.com"); }, });
你的tsconfig.json里已经加了"WebWorker"这个lib,刚好能在Worker环境里正确识别相关类型,不用额外调整。
方法二:手动模拟FetchEvent
如果你的测试场景不需要完整的Worker环境,或者只想测试库的核心逻辑,那手动模拟一个FetchEvent对象更轻量。你可以根据库实际用到的属性和方法,实现一个简化版的Mock类:
import { assertEquals } from "https://deno.land/std@0.224.0/assert/mod.ts"; // 自定义模拟FetchEvent类 class MockFetchEvent extends Event { request: Request; preloadResponse: Promise<Response | undefined>; constructor(type: string, init: { request: Request; preloadResponse?: Promise<Response | undefined> }) { super(type); this.request = init.request; this.preloadResponse = init.preloadResponse ?? Promise.resolve(undefined); } // 如果你的库用到了respondWith方法,按需模拟 respondWith(response: Promise<Response> | Response) { // 这里可以根据测试需求添加逻辑,比如记录传入的响应 console.log("模拟respondWith调用", response); } } // 测试用例 Deno.test("用模拟对象测试Service Worker库", () => { const mockEvent = new MockFetchEvent("fetch", { request: new Request("https://test-demo.com"), }); // 把mockEvent传入你的库进行测试 // yourServiceWorkerLibrary.handleFetch(mockEvent); assertEquals(mockEvent.type, "fetch"); });
这种方式的好处是灵活,你可以精准控制Mock对象的行为,适合单元测试场景。
两种方法各有侧重:如果需要完整的API行为就用Worker环境,要是只测核心逻辑,Mock对象更高效。
内容来源于stack exchange
相关产品推荐
相关产品推荐

