【问题标题】:Gulp Node.js Istanbul IspartaGulp Node.js 伊斯坦布尔 Isparta
【发布时间】:2016-04-05 05:12:06
【问题描述】:

我正在尝试使用 Istanbul 和 Isparta 进行单元测试覆盖,但遇到了一些麻烦。

实际上,这是我的 gulp 文件任务:

gulp.task('pre-test', ['default'], function() {
  return gulp.src('src/app/**/*.js')
    .pipe(plumber())
    .pipe(istanbul({
      instrumenter: isparta.Instrumenter,
      includeUntested: true
    }))
    .pipe(istanbul.hookRequire());
});

gulp.task('test', ['pre-test'], function() {
  return gulp.src('src/test/**/*.js')
    .pipe(mocha({reporter: 'spec'}))
    .pipe(istanbul.writeReports({}));
});

当我启动 gulp "test" 任务时,出现以下错误:

[08:34:17] Plumber found unhandled error:
 Error in plugin 'gulp-istanbul'
Message:
    Unable to parse C:\projects\nodejs\mon-notaire\src\app\core\logger\concrete\ConsoleLogger.js

Line 1: Unexpected token

[08:34:17] Finished 'pre-test' after 2.11 s
[08:34:17] Starting 'test'...

stream.js:94
      throw er; // Unhandled stream error in pipe.
            ^
C:\projects\nodejs\mon-notaire\src\test\core\TestConfReader.js:1
(function (exports, require, module, __filename, __dirname) { import ConfReade
                                                              ^^^^^^
SyntaxError: Unexpected reserved word
    at exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:443:25)
    at Object.Module._extensions..js (module.js:478:10)
    at Object.Module._extensions.(anonymous function) [as .js] (C:\projects\nodejs\mon-notaire\node_modules\gulp-istanbul\node_modules\istanbul\lib\hook.js:109:37)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at C:\projects\nodejs\mon-notaire\node_modules\mocha\lib\mocha.js:192:27
    at Array.forEach (native)
npm ERR! Test failed.  See above for more details.

如何防止这些错误发生?

【问题讨论】:

    标签: javascript node.js istanbul isparta


    【解决方案1】:

    这一行:

    Message:
        Unable to parse C:\projects\nodejs\mon-notaire\src\app\core\logger\concrete\ConsoleLogger.js
    

    意味着 ConsoleLogger.js 中的代码存在问题,因此您可能需要检查该文件。

    这条线:

    C:\projects\nodejs\mon-notaire\src\test\core\TestConfReader.js:1
    (function (exports, require, module, __filename, __dirname) { import ConfReade
                                                                  ^^^^^^
    SyntaxError: Unexpected reserved word
    

    建议您使用的是 ES6,但您的 gulp 任务在运行之前没有将其转换为 ES5,这就是您收到错误的原因。

    我已经创建了一个yeoman generator,它正是为此目的创建了一个项目(在 ES6 中编写 nodeJs 项目),并包括使用 istanbul 和源代码映射的代码覆盖率。你可能想看看那个。

    否则,这是我来自那个生成器的working gulpfile

    我使用 istanbul,以及一个名为 remap-istanbul 的模块。

    【讨论】:

      【解决方案2】:

      你设置.babelrc了吗?

      如果你使用的是最新版本的isparta,它依赖于 babel v6,那么你需要像下面这样设置.babelrc。 (你也需要做npm install --save-dev babel-preset-es2015

      {
        "presets": [
          "es2015"
        ]
      }
      

      【讨论】:

      • 我不使用 babel.rc 因为我不使用 babel 命令,但是 gulp one
      • .babelrc 不仅适用于 babel-cli,而且适用于所有依赖于 babel-core 的工具,例如 babelify、isparta、gulp 的 babel-model 等。它似乎没有记录好吧,但就我在各种环境中的尝试而言,它是这样工作的。 This 是我使用 karma、browserify 和 isparta 的示例设置。如果我删除.babelrc,我会收到与上述类似的错误。
      【解决方案3】:

      错误信息表明你使用的是ES6,但是gulp-istanbul默认不支持。

      当然,您可以编写函数来编译 ES6 代码,但考虑到在这种情况下您使用的是 gulp,恕我直言,您可以做的最简单的方法是使用 gulp-babel-istanbul 而不是 gulp-istanbul,不需要更改您上面附加的代码。

      import istanbul from 'gulp-babel-istanbul'
      

      其余代码保持不变。

      【讨论】:

        【解决方案4】:

        来自 gulp-istanbul github 页面。

        var isparta = require('isparta');
        var istanbul = require('gulp-istanbul');
        
        gulp.src('lib/**.js')
          .pipe(istanbul({
            // supports es6
            instrumenter: isparta.Instrumenter
          }));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-17
          • 2016-11-16
          • 2023-03-11
          • 1970-01-01
          • 2015-03-29
          • 2013-12-21
          • 2016-01-22
          • 1970-01-01
          相关资源
          最近更新 更多