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

使用Jest-environment-jsdom集成MSW时出现TextEncoder未定义错误

解决MSW在Jest jsdom环境下TextEncoder未定义的问题

问题原因

当使用jest-environment-jsdom测试环境时,jsdom默认没有全局暴露Node.js的TextEncoder和TextDecoderAPI,而MSW的Node端依赖(msw/node)需要用到这些API,因此抛出ReferenceError。

解决方案

方案1:在测试初始化文件中手动补全局API

修改setupTests.ts,在最顶部添加全局对象的赋值:

// 先补全缺失的全局API
import { TextEncoder, TextDecoder } from 'node:util';
global.TextEncoder = TextEncoder;
global.TextDecoder = TextDecoder;

// 原有代码
import '@testing-library/jest-dom/extend-expect';
import { server } from './mocks/server';

beforeAll(() => server.listen());
afterEach(() => server.resetHandlers());
afterAll(() => server.close());

方案2:升级jsdom版本

如果你的jsdom版本较低,可能本身未内置TextEncoder支持。执行以下命令升级到最新稳定版:

npm install jsdom@latest --save-dev
# 或用yarn
yarn add jsdom@latest --dev

方案3:调整Jest配置适配ES模块

由于你项目使用了type: module,确保Jest和ts-jest正确处理ES模块,在jest.config.json中添加以下配置:

{
  "preset": "ts-jest",
  "testEnvironment": "jest-environment-jsdom",
  "setupFilesAfterEnv": ["./setupTests.ts"],
  "moduleDirectories": ["node_modules", "<rootDir>"],
  "testEnvironmentOptions": {
    "customExportConditions": [""]
  },
  "transform": {
    "^.+\\.js$": "babel-jest"
  },
  // 添加ES模块适配配置
  "extensionsToTreatAsEsm": [".ts"],
  "globals": {
    "ts-jest": {
      "useESM": true
    }
  }
}

额外检查

确保你的tsconfig.test.json中包含必要的类型和库:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "lib": ["ESNext", "DOM"],
    "types": ["jest", "jsdom"]
  }
}

内容的提问来源于stack exchange,提问作者Álvaro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:52:38