我有一个工作的react应用程序,我在浏览器和测试中使用msw
来模拟BE(Jest)。使用msw v1.3.0一切都很好,我决定更新它v2.0,在那里我遇到了问题。我所有的测试都失败了,因为错误ReferenceError: TextEncoder is not defined
。在浏览器模式下,它工作得很好。
我已经联系了msw
支持,他们告诉我这个问题是Jest相关的。我已经尝试了许多变通方法如何定义TextEncoder
在通常情况下,这可能是工作,但都是徒劳的。
所有版本都是新的(node:v18.14.2,npm:v9.5.0,typescript:v4.9.5,react:v18.2.0,jest:v27.5.1)。
我尝试创建一个单独的jest.config.js
文件,并像这样定义TextEncoder
:
module.exports = {
globals: {
TextEncoder: require('util').TextEncoder,
TextDecoder: require('util').TextDecoder,
}
}
字符串
从文件:
module.exports = {
setupFiles: ['<rootDir>/setupFiles.js'],
}
型
我尝试从'util'和'node:util'导入TextEncoder:
const { TextDecoder, TextEncoder } = require('node:util');
Object.defineProperties(globalThis, {
TextDecoder: { value: TextDecoder, writable: true },
TextEncoder: { value: TextEncoder, writable: true },
});
型
我试着从不同的外部“文本编码”库中导入它,并在JavaScript中添加testEnvironment: 'node'
,但所有这些都不适用于我的情况。
1条答案
按热度按时间e0uiprwp1#
JSDOM和它的竞争对手HappyDOM在它们的globals上都没有TextDecoder / TextEncoder的实现,因此不仅找不到它们,而且如果没有访问VM内部的全局上下文,就不能添加它们。
他们这样做的原因是他们模拟浏览器,如果例如'fs'或其他节点标准库是可访问的,这将没有意义。
试试这个,让我知道它是否有效;我在使用MSW 2.0的Node 18.18.2上工作
个字符
我认为这个解决方案是一个部分黑客,但你的选择是非常有限的,除了创建一个公关或问题与JSDOM或HappyDOM添加支持这些。