在运行`react-scripts test --env = jsdom`时,出现'ReferenceError:TextEncoder未定义'。

Jus*_*ris 3 reactjs tensorflow.js

我在应用程序中使用TensorFlow编码器。当应用程序运行时,它在我的浏览器中可以正常工作,但是在测试其构建时遇到问题:

$ npx react-scripts test --env=jsdom
FAIL  src/App.test.js
  ? Test suite failed to run

    ReferenceError: TextEncoder is not defined

      16 | import TextField from '@material-ui/core/TextField';
      17 | import Typography from '@material-ui/core/Typography';
    > 18 | import * as mobilenet from '@tensorflow-models/mobilenet';
         | ^
      19 | import * as UniversalSentenceEncoder from '@tensorflow-models/universal-sentence-encoder';
      20 | import * as tf from '@tensorflow/tfjs';
      21 | import axios from 'axios';

      at new PlatformBrowser (node_modules/@tensorflow/tfjs-core/src/platforms/platform_browser.ts:26:28)
      at Object.<anonymous> (node_modules/@tensorflow/tfjs-core/src/platforms/platform_browser.ts:50:30)
      at Object.<anonymous> (node_modules/@tensorflow/tfjs-core/src/index.ts:29:1)
      at Object.<anonymous> (node_modules/@tensorflow/tfjs-converter/src/executor/graph_model.ts:18:1)
      at Object.<anonymous> (node_modules/@tensorflow/tfjs-converter/src/index.ts:17:1)
      at Object.<anonymous> (node_modules/@tensorflow-models/mobilenet/dist/index.js:38:14)
      at Object.<anonymous> (src/components/model.js:18:1)
      at Object.<anonymous> (src/App.js:8:1)
      at Object.<anonymous> (src/App.test.js:3:1)
Run Code Online (Sandbox Code Playgroud)

我想摆脱那个错误。我尝试使用“文本编码”包,但是不确定在导入之前如何正确定义TextEncoder。

也许我可以设置其他选项--env

没有,我也会遇到同样的错误--env=jsdom。我相信我在收到类似类型的未定义错误后添加了它,并且它纠正了一个问题。

这是我的测试:

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';

it('renders without crashing', () => {
  const div = document.createElement('div');
  ReactDOM.render(<App />, div);
  ReactDOM.unmountComponentAtNode(div);
});
Run Code Online (Sandbox Code Playgroud)

因此设置--env=node无效,因为:ReferenceError: document is not defined

小智 20

感谢您的回答。一种似乎有效的更简单的格式,至少testEnvironment: 'jsdom'是:

  setupFiles: [`<rootDir>/jest-shim.js`],
Run Code Online (Sandbox Code Playgroud)

笑话-shim.js:

import { ArrayBuffer, TextDecoder, TextEncoder, Uint8Array } from 'util';

global.TextEncoder = TextEncoder;
global.TextDecoder = TextDecoder;
global.ArrayBuffer = ArrayBuffer;
global.Uint8Array = Uint8Array;
Run Code Online (Sandbox Code Playgroud)


小智 17

我的 Node.Js 项目遇到同样的错误。为了测试目的,我在那里使用了笑话。所以以下步骤解决了我的问题

step-1:在项目的根文件夹中添加一个名为 jest.config.js 的文件

step-2:在 jest.config.file 中添加以下行:

    模块. 导出 = {
        测试环境:“节点”
    };

  • 谢谢。这对我有用,是更干净、更短的解决方案。 (3认同)

小智 6

jsdom似乎没有TextEncoder为DOM全局​​定义。因此,您可以将其与node.js一起填写。

测试/custom-test-env.js:

const Environment = require('jest-environment-jsdom');

/**
 * A custom environment to set the TextEncoder that is required by TensorFlow.js.
 */
module.exports = class CustomTestEnvironment extends Environment {
    async setup() {
        await super.setup();
        if (typeof TextEncoder === 'undefined') {
            const { TextEncoder } = require('util');
            this.global.TextEncoder = TextEncoder;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

npx react-scripts test --env=./test/custom-test-env.js

  • 嗯,我按照描述尝试了此操作,但收到错误“TypeError:类扩展值 #&lt;Object&gt; 不是构造函数或 null”。我不得不切换到“jest-environment-jsdom-global” (7认同)
  • 我这样做了,并在 `jest.config.js` 上添加 `'testEnvironment': '&lt;rootDir&gt;/test/custom-test-env.js'` (3认同)
  • 由于 `typeof TextEncoder === 'undefined'` 将始终返回 `false`。需要将其更改为:`typeof this.global.TextEncoder === 'undefined'` (2认同)