Mocha - 运行测试出现 ReferenceError: regeneratorRuntime 未定义错误

4
我正在尝试使用 mocha 运行基于 async/await 的测试。在我开始工作之前,项目架构已经设置好,并且我一直在尝试将其 node 版本更新为 8.9.4。该项目是一个同构应用程序,使用 babel、gulp 和 webpack 运行。 为了运行测试,我们运行 gulp 任务。在项目中有两个 .bablerc 文件,一个位于项目的根目录下,另一个位于测试文件夹中。 两者都具有相同的配置:
{
  "presets": [
    ["env", {"exclude": ["transform-regenerator"]}],
    "react",
    "stage-1"
  ],
  "plugins": [
    "babel-plugin-root-import"
  ]
}

当我在本地运行应用程序时,不会返回任何错误。但是当我使用gulp test:api运行测试时,我经常会遇到以下错误:ReferenceError: regeneratorRuntime未定义

这是我在测试文件夹中的gulp文件:

var gulp = require('gulp')
var gutil = require('gulp-util')
var gulpLoadPlugins = require('gulp-load-plugins')
var plugins = gulpLoadPlugins()
var babel = require('gulp-babel')


require('babel-register')({
    presets:["es2015", "react", "stage-1"]
});

// This is a cheap way of getting 'test:browser' to run fully before 'test:api' kicks in.
gulp.task('test', ['test:browser'], function(){
    return gulp.start('test:api')
});

gulp.task('test:api', function () {
    global.env = 'test'
    gulp.src(['test/unit-tests/server/**/*.spec.js'], {read: false})
        .pipe(plugins.mocha({reporter: 'spec'}))
        .once('error', function (error) {
            console.log(error)
            process.exit(1);
        })
        .once('end', function () {
            process.exit(0);
        })
});

gulp.task('default', ['test']);

任何关于为什么会发生这种情况的帮助都将不胜感激。
4个回答

4

Node.js 8已经支持async/await,因此您不需要使用Babel进行转换;实际上,您的根目录下的.babelrc文件已经包含了这个预设来排除会转换async/awaitregenerator(并引入对regeneratorRuntime的依赖):

["env", {"exclude": ["transform-regenerator"]}]

然而,在您的测试文件中,配置没有指定这个预设。相反,它指定了预设"es2015",这个预设包括不需要的transform-regenerator(您可以在https://babeljs.io/docs/plugins/preset-es2015/上看到)。如果您将其更改为与根目录下的预设匹配,您将获得更一致的结果。


3

奇怪的是,在将Node从v8.6.x升级到v8.10.0后,我遇到了这个问题。我在我的test-setup.js中使用了babel-require:

require('babel-register')();

测试工具是Mocha、chai、enzyme+JSDOM。当我对API进行异步调用时,或者通过saga使用生成器函数时,我也遇到了同样的问题。添加babel-polyfill似乎解决了这个问题。

require('babel-register')(); require('babel-polyfill');

我想连babel文档本身都提倡为生成器等使用polyfill。

不包括Polyfill 当使用需要它的功能(如生成器)时,您必须单独包含一个Polyfill。


1
我也遇到了同样的问题,我正在调用一个异步API,并安装了babel-polyfill并将其添加到测试文件中(import "@babel/polyfill"),这解决了问题。 - fanta

0
在使用 Visual Studio Code 运行 mocha 测试时,遇到了相同的问题。
解决方案是在 Visual Studio Code 的 settings.json 文件中添加必要的 babel 插件:
"mocha.requires": [
    "babel-register",
    "babel-polyfill"
],

0

我在使用async/awaitmochanyc以及尝试运行coverage时,遇到过这个错误。在利用mocha运行测试时从未出现问题,只有在利用nyc运行覆盖率时才会出现问题。

  11) Filesystem:removeDirectory
       Filesystem.removeDirectory()
         Should delete the directory "./tmp".:
     ReferenceError: regeneratorRuntime is not defined
      at Context.<anonymous> (build/tests/filesystem.js:153:67)
      at processImmediate (internal/timers.js:461:21)

您可以通过几种不同的方式来解决这个问题。

方法1 - NPM的package.json

...
"nyc": {
    "require": [
      "@babel/register",
      "@babel/polyfill"
    ],
    ...
},
...

这真的取决于你使用的polyfill软件包。建议使用作用域限定的(@babel)版本:@babel/pollyfill。但是,如果你使用的是babel-polyfill,那么确保它是你所引用的。

方法2-直接导入

your-test-file.js(es6/7):

...
import '@babel/polyfill';
...

OR

your-test-file.js (CommonJS):

...
require("@babel/polyfill");
...

不要将其分配给变量,只需导入或需要该包。同样,使用您已经提取的包的名称进行变异。它包含polyfill并解决错误。

希望对您有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接