ReferenceError:在开玩笑测试中没有定义 React

Posted

技术标签:

【中文标题】ReferenceError:在开玩笑测试中没有定义 React【英文标题】:ReferenceError: React is not defined in jest tests 【发布时间】:2020-03-17 17:46:11 【问题描述】:

我有以下在浏览器中正确执行的行

eval(Babel.transform(template, presets: ['react'] ).code);

但是当我运行玩笑测试时,我得到了ReferenceError: React is not defined

我错过了什么?

更多信息: 在测试文件中我有以下内容:

const wrapper = shallow(<MyComponent/>);
const instance = wrapper.instance();
instance.componentFunction(...)

然后componentFunction 有eval(Babel.transform(template, presets: ['react'] ).code); 行,其中template 是它从测试文件中获取的东西,可以是&lt;span&gt;...&lt;/span&gt; 之类的东西

如果需要更多详细信息,请告诉我

【问题讨论】:

【参考方案1】:

如果您在 jest 测试文件中使用 JSX,则需要在文件顶部添加以下导入行:

import React from 'react';

原因是 Babel 将 JSX 语法转换为一系列 React.createElement() 调用,如果你导入 React 失败,这些调用都会失败。

【讨论】:

我在.test 文件中有import React from 'react'; 您还需要将它放在 component 文件中。例如,import React, Component from "react"; 至少,这解决了我的问题。【参考方案2】:

Next.js 的最佳解决方案(jsx: 'preserve' 具体是: 按照下一个方式配置您的 babel 配置:(无需安装另一个 babel 插件):

babel.config.js:

module.exports = 
  presets: ['next/babel']
;

或者,如果遇到此错误的任何人遇到问题,其中 import React from 'react' 不是必需的,因为它已经包含在全局范围内并且不需要包含在每个文件中,那么此解决方案可能适合您。

我只是简单地将 React 配置为以开玩笑的方式全局定义。

我的jest.config.js

module.exports = 
  moduleDirectories: ['./node_modules', 'src'],
  // other important stuff
  setupFilesAfterEnv: ['<rootDir>/src/jest-setup.ts']

import '@testing-library/jest-dom';
import React from 'react';

global.React = React; // this also works for other globally available libraries

现在我不需要担心每个文件都会导入 React(尽管 eslint 知道 Next.js 不需要这样做)

【讨论】:

【参考方案3】:

@babel/preset 已经支持您的需求。根据react 17 documentation,我只需在babel.config.json 中将runtime 设置为automatic


  "presets": [
    ["@babel/preset-react", 
      "runtime": "automatic"
   ]
  ]

如果你使用@babel/plugin-transform-react-jsx,配置应该是


  "plugins": [
    ["@babel/plugin-transform-react-jsx", 
      "runtime": "automatic"
    ]
  ]

通常不需要后者,因为@babel/preset-react 包含@babel/plugin-transform-react-jsx


为什么你不应该使用import React from 'react';

documentation states:

有些performance improvements and simplifications 是React.createElement 不允许的。

还有一个technical RFC 解释了新转换的工作原理。

如果您想升级。 React 还提供了一个automated script,它可以从你的代码中删除不必要的导入。

【讨论】:

以上是关于ReferenceError:在开玩笑测试中没有定义 React的主要内容,如果未能解决你的问题,请参考以下文章

带有 Jest 的打字稿 - “ReferenceError:未定义 beforeAll”

ReferenceError:未定义窗口。当我通过 jest 运行 npm test 进行单元测试时出现此错误

玩笑-ReferenceError:导入的函数未定义

Dispatcher 没有在开玩笑的单元测试中注册回调

调度程序没有在开玩笑的单元测试中注册回调

开玩笑 没有找到测试