Reactjs `运行Jest测试时未定义regeneratorRuntime`
这个标题很好地解释了我面临的问题。我试图测试一个具有某种状态的Reactjs `运行Jest测试时未定义regeneratorRuntime`,reactjs,babeljs,jestjs,babel-polyfill,babel-jest,Reactjs,Babeljs,Jestjs,Babel Polyfill,Babel Jest,这个标题很好地解释了我面临的问题。我试图测试一个具有某种状态的React组件,并尝试向该组件提供我的存储,以获得它所需的内容。当我使用Jest运行组件测试时,出现以下错误: ReferenceError:未定义regeneratorRuntime 通过一些阅读,我确定这是由babel polyfill或再生器运行时未正确应用于Jest造成的。但是,我已经尝试安装这两个软件包并重新运行,结果没有变化。在阅读Jest Github问题页面()之后,我发现自版本19起,Jest不会自动包含babel
React
组件,并尝试向该组件提供我的存储,以获得它所需的内容。当我使用Jest运行组件测试时,出现以下错误:
ReferenceError:未定义regeneratorRuntime
通过一些阅读,我确定这是由babel polyfill
或再生器运行时
未正确应用于Jest造成的。但是,我已经尝试安装这两个软件包并重新运行,结果没有变化。在阅读Jest Github问题页面()之后,我发现自版本19起,Jest不会自动包含babel polyfill
。我手动安装的那个软件包应该已经解决了这个问题,但它没有。我已经包括了一些我认为相关的文件
.babelrc
:
{
"presets": ["es2015", "react", "stage-2"],
"env": {
"development": {
"plugins": [
["react-transform", {
"transforms": [{
"transform": "react-transform-hmr",
"imports": ["react"],
"locals": ["module"]
}]
}]
]
}
}
}
jest.config
:
{
"transform": {
"^.+\\.(js|jsx)$": "<rootDir>/node_modules/webpack-babel-jest",
".*\\.(vue)$": "<rootDir>/node_modules/jest-vue-preprocessor",
".*": "babel-jest"
},
"moduleNameMapper": {
"\\.(jpg|jpeg|css|scss|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/__tests__/__mocks__/fileMock.js",
".*\\.(vue)$": "vue/dist/vue.js"
},
"testPathIgnorePatterns": ["type_parser.spec.js",
"<rootDir>/__tests__/__mocks__/",
"__tests__/unit/core/util/type_parser.js",
"__tests__/GitlabLoader.test.js"
]
}
我使用了导入“babel polyfill”
解决了我的问题
更新2020:
此答案已过时,
babel polyfill
已被弃用。查看和。在将巴贝尔polyfill
导入到每个工作的测试中时,建议在巴贝尔配置中设置此选项。如果执行此操作,则不再需要导入babel polyfill
。(就我个人而言,我的预设环境
配置中缺少了目标
选项)
一句至理名言:指定
目标
将覆盖您定义的任何浏览器列表
配置(否则巴贝尔会使用)。因此,在web项目中,您可能需要创建一个动态的babel.config.js
,该动态的babel.config.js
具有“jest-aware”特性,以便在测试环境中只添加目标。如果您使用的是setupTests.js文件,您可以从该文件导入再生器运行时,请参阅中标题为“使您的Babel配置具有jest意识”的部分。:
// setupTests.js
import 'regenerator-runtime/runtime'
import Enzyme from 'enzyme'
import EnzymeAdapter from 'enzyme-adapter-react-16'
Enzyme.configure({
adapter: new EnzymeAdapter()
})
然后,您可以将setupTests.js导入每个测试文件,或者更好地导入package.json中,只需将setupfileafterenv添加到jest配置:
// package.json
{
...
"dependencies": {
...
},
"devDependencies": {
...
},
"jest": {
"setupFilesAfterEnv": ["./pathToYour/setupTests.js"]
}
}
不要忘记安装软件包:
无需导入完整的babel polyfill(或@babel/polyfill,如果是babel≥ v、 7.0.0)顺便说一句,btw一直赞成直接包括核心js/stable和再生器运行时/运行时。截至2019年10月2日的最新解决方案是在您的setupTests.js
文件中导入以下内容
import 'core-js/stable';
import 'regenerator-runtime/runtime';
babel polyfill
已被弃用。使用babel-core@bridge
已安装且@babel/core@7
:
我通过添加插件并将以下内容传递到我的babel配置中解决了这个问题:
{
// ...
环境:{
测试:{
// ...
插件:[
“@babel/plugin转换运行时”
]
}
}
}
编辑:或者,因为您也可以只向@babel/preset env
的配置中添加一个选项,并且它应该可以工作:
{
“预设”:[
[
“@babel/preset env”,
{
“目标”:{
“节点”:“当前”
}
}
]
]
}
对于2020年遇到此问题的人,在仔细阅读之后,我发现其他答案中缺少以下信息
我的项目已按照中的建议进行配置。
在完成所有这些步骤并将“@babel/register”
导入到我的两个入口点的顶部之后,ReferenceError仍然存在。从jest文档中,我发现了以下内容,解决了我的问题:
//babel.config.js
跟进杰罗的回答。如果您使用的是npm,您可以执行npm i-D再生器运行时
,然后导入“再生器运行时/运行时”代码>在您的测试文件中。我正在使用Laravel mix中的Vuejs、Vue Jest,这对我很有用
import 'regenerator-runtime/runtime'
import { mount } from '@vue/test-utils'
import App from '../App';
// eslint-disable-next-line no-undef
test('it works', () => {
// eslint-disable-next-line no-undef
expect(1 + 1).toBe(2);
});
// eslint-disable-next-line no-undef
test('should mount without crashing', () => {
const wrapper = mount(App);
// eslint-disable-next-line no-undef
expect(wrapper).toMatchSnapshot();
});
如果有人在搜索错误消息时登陆此处,但未使用巴贝尔,则可能是项目目录中存在旧的巴贝尔配置文件,因为:
让您的Babel配置了解笑话
[…]
如果使用babel配置,Jest将自动转换文件
存在于您的项目中。要避免这种行为,可以显式地
重置转换配置选项:
//jest.config.js
module.exports={
转换:{},
};
“我的手动安装程序包应该已经解决了这个问题,但它没有。”您是否在任何地方导入该程序包?只是安装它没有任何作用。我试图通过在测试文件中导入“babel polyfill”
来提供它,以及在我的.babelrc
的插件部分提供它,没有任何更改。你是在什么文件中导入的?我将它导入到我的实际测试中,这解决了问题。为什么不在网页包配置文件条目中全局添加它解决了问题?为每个测试导入它并不理想。不推荐使用Balabel polyfill。不要用它。看看这里发生了什么,为什么:。遵循@jero的解决方案。@PatrickSzalapski我在setupTests.js
文件中导入了它。在这种情况下,如果您只是将其引入jest配置,那么再生器运行时包不应该是一个开发人员依赖项吗?是的@Periback,在您仅将再生器运行时用于测试的情况下,您应该将其作为开发人员依赖项包括在内$Thread添加再生器运行时--dev
@Rafan2010您能接受这个答案吗?这是2020年更好的答案。不涉及添加另一个依赖项。从节点10开始就受支持,因此不需要Babel。添加import'registrator runtime/runtime'
为我做到了这一点!谢谢我必须将该导入行添加到我的globalSetup
文件中,并作为setupFi的一行文件
$ yarn add regenerator-runtime --dev
import 'core-js/stable';
import 'regenerator-runtime/runtime';
module.exports = {
presets: [
[
'@babel/preset-env',
{
targets: {
node: 'current',
},
},
],
],
};
import 'regenerator-runtime/runtime'
import { mount } from '@vue/test-utils'
import App from '../App';
// eslint-disable-next-line no-undef
test('it works', () => {
// eslint-disable-next-line no-undef
expect(1 + 1).toBe(2);
});
// eslint-disable-next-line no-undef
test('should mount without crashing', () => {
const wrapper = mount(App);
// eslint-disable-next-line no-undef
expect(wrapper).toMatchSnapshot();
});