ReferenceError:在使用jest和msw v2.0进行测试运行期间,未定义TextEncoder

dgsult0t  于 2023-11-15  发布在  Jest
关注(0)|答案(1)|浏览(182)

我有一个工作的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',但所有这些都不适用于我的情况。

e0uiprwp

e0uiprwp1#

JSDOM和它的竞争对手HappyDOM在它们的globals上都没有TextDecoder / TextEncoder的实现,因此不仅找不到它们,而且如果没有访问VM内部的全局上下文,就不能添加它们。
他们这样做的原因是他们模拟浏览器,如果例如'fs'或其他节点标准库是可访问的,这将没有意义。
试试这个,让我知道它是否有效;我在使用MSW 2.0的Node 18.18.2上工作

// inside your jest.setup.js
testEnvironment: "./jest.environment.js",

个字符
我认为这个解决方案是一个部分黑客,但你的选择是非常有限的,除了创建一个公关或问题与JSDOM或HappyDOM添加支持这些。

相关问题