You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 12:04:35