javascript 为什么我在Jest中得到“TextEncoder is not defined”?

5w9g7ksd  于 2023-04-04  发布在  Java
关注(0)|答案(4)|浏览(790)

当测试一个使用TextEncoder或TextDecoder的函数时,我得到:

ReferenceError: TextEncoder is not defined
ReferenceError: TextDecoder is not defined

我用的是jsdom,为什么不工作?

4ktjp1zp

4ktjp1zp1#

虽然它应该与jsdom捆绑在一起,但它没有与jsdom 16捆绑在一起。因此,您可以像这样使用polyfill:

import { TextEncoder, TextDecoder } from 'util';

Object.assign(global, { TextDecoder, TextEncoder });
nxagd54h

nxagd54h2#

我也收到了这个错误,并且正在使用标准的Next.js jest和react测试库测试设置,在这里的文档中概述:https://nextjs.org/docs/testing#setting-up-jest-with-the-rust-compiler。
特别是,它使用jest.config.js配置文件中的testEnvironment: 'jest-environment-jsdom'测试环境。
不幸的是,在我的一个后端API路由(Express路由)中导入jsdom破坏了我的测试,给了我TextEncoder is not defined错误。
我能够通过将以下 * 添加到包含损坏的测试 * 的文件的顶部来修复它:

/**
 * @jest-environment node
 */
// my-broken-node-only-test.js

通过jest文档阅读更多关于此技术的内容。
最后,Jest维护者Simen的以下问题评论帮助澄清了我的情况:https://github.com/jsdom/jsdom/issues/2524#issuecomment-902027138

fkvaft9z

fkvaft9z3#

在TypeScript中添加@leonheess的答案:
添加到测试文件的顶部(错误发生的地方,在导致错误的行之前):

import { TextEncoder, TextDecoder } from 'util'
global.TextEncoder = TextEncoder
// @ts-expect-error
global.TextDecoder = TextDecoder

即使是很好地尝试,例如。

import { TextEncoder, TextDecoder } from 'util'
global.TextEncoder = TextEncoder
global.TextDecoder = { prototype: TextDecoder }

我犯了错误

Type 'typeof TextDecoder' is missing the following properties from type 'TextDecoder': decode, encoding, fatal, ignoreBOMts(2739)

或与

global.TextDecoder = {prototype: new TextDecoder("utf-8")}

我得到

Type 'import("util").TextDecoder' is not assignable to type 'TextDecoder'.
  Types of property 'decode' are incompatible.
    Type '(input?: ArrayBuffer | ArrayBufferView | null | undefined, options?: { stream?: boolean | undefined; } | undefined) => string' is not assignable to type '(input?: BufferSource | undefined, options?: TextDecodeOptions | undefined) => string'.
      Types of parameters 'input' and 'input' are incompatible.
        Type 'BufferSource | undefined' is not assignable to type 'ArrayBuffer | ArrayBufferView | null | undefined'.
          Type 'ArrayBufferView' is not assignable to type 'ArrayBuffer | ArrayBufferView | null | undefined'.
            Type 'ArrayBufferView' is missing the following properties from type 'DataView': getFloat32, getFloat64, getInt8, getInt16, and 17 more.

所以最好只分配并忽略不兼容性。

import { TextEncoder, TextDecoder } from 'util'
global.TextEncoder = TextEncoder
// @ts-expect-error
global.TextDecoder = TextDecoder
txu3uszq

txu3uszq4#

确保您的whatwg-url软件包至少具有^10.0.0版本

相关问题