Mocha - 运行测试ReferenceError:未定义regeneratorRuntime

时间:2018-03-27 14:41:08

标签: node.js gulp mocha babel

我正在尝试使用async/await使用mocha运行测试。项目架构是在我开始工作之前设置的,我一直在尝试将其节点版本更新为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 is not defined

这是我在测试文件夹中的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 个答案:

答案 0 :(得分:1)

节点版本8已经支持async/await,因此您不需要Babel来对其进行转换;实际上,您的根.babelrc包含此预设,以排除将转换regenerator的{​​{1}}(并引入对regeneratorRuntime的依赖):

async/await

但是,在测试文件中,配置不指定此预设。相反,它会指定预设["env", {"exclude": ["transform-regenerator"]}],其中 包含不需要的"es2015"(正如您在https://babeljs.io/docs/plugins/preset-es2015/看到的那样)。如果您更改此选项以匹配根.babelrc中的预设,您将获得更一致的结果。

答案 1 :(得分:1)

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

中使用了babel-require

require('babel-register')();

和测试工具是摩卡,柴,酶+ JSDOM。当我对API进行异步调用时,我也遇到了同样的问题,同时通过sagas使用生成器函数。添加babel-polyfill似乎解决了这个问题。

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

我猜甚至babel docs自己也主张将polyfill用于生成器等等

  

不包含Polyfill   在使用需要它的功能时,必须单独包含填充物,如发生器。

答案 2 :(得分:0)

在Visual Studio代码中运行摩卡测试时遇到同样的问题

解决方案是在Visual Studio代码settings.json中添加必要的babel插件:

"mocha.requires": [
    "babel-register",
    "babel-polyfill"
],

答案 3 :(得分:0)

在使用 async / await mocha nyc 以及尝试运行时,我遇到了这个错误>覆盖率。利用mocha进行运行测试从来没有问题,只需结合 mocha 测试同时利用 nyc 进行运行覆盖。

--format="%H"

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

方法1-NPM的 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)

package.json

这实际上取决于您使用的是哪个 polyfill 软件包。建议使用范围( @babel )变体:... "nyc": { "require": [ "@babel/register", "@babel/polyfill" ], ... }, ... 。但是,如果您使用的是@babel/pollyfill,请确保这是您引用的内容。

方法2-直接导入

babel-polyfill(es6 / 7):

your-test-file.js

OR

... import '@babel/polyfill'; ... CommonJS ):

your-test-file.js

不要将其分配给变量,只需导入或需要该软件包即可。同样,使用软件包名称作为您获取的变体。它包括polyfill并解决了错误。

HTH

相关问题