为什么在Jest中运行测试时出现TextEncoder is not defined报错?
问题原因
TextEncoder和TextDecoder属于Web API规范,默认未被旧版jsdom注入到模拟的浏览器全局环境中。虽然Node.js v11及以上版本已经内置了这两个API,但低版本jsdom不会主动将其绑定到测试运行的全局对象或者模拟的window对象上,因此会触发未定义的报错。
可行解决方案
- 方案1:将jsdom升级到v16及以上版本,该版本开始已经默认内置了对
TextEncoder、TextDecoder的全局挂载,升级后无需额外配置即可正常使用 - 方案2:如果受项目限制无法升级jsdom版本,可以在测试初始化代码中手动挂载全局API:
// Node.js v11及以上版本可用 const { TextEncoder, TextDecoder } = require('util'); global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder;
- 方案3:如果使用Jest等测试框架搭配jsdom,可以在框架的全局初始化配置文件(比如Jest的
setupFilesAfterEnv指定的文件)中加入上述手动挂载的代码即可全局生效
若你使用的Node.js版本低于v11,需要先安装
text-encoding依赖包后再进行挂载:const { TextEncoder, TextDecoder } = require('text-encoding'); global.TextEncoder = TextEncoder; global.TextDecoder = TextDecoder;
内容的提问来源于stack exchange,提问作者leonheess
相关产品推荐
相关产品推荐

