巴贝尔生成的代码打破了伊斯坦布尔的报道

时间:2016-08-09 16:08:48

标签: javascript babeljs istanbul

我使用babel在节点项目中启用ES6导入。同时使用mocha进行测试,使用istanbul进行测试。我最终得到的覆盖率低于全部,因为babel会生成如下代码:

'use strict';

 Object.defineProperty(exports, "__esModule", {
     value: true
 });

 var _promise = require('babel-runtime/core-js/promise');

 var _promise2 = _interopRequireDefault(_promise);

 var _koa = require('koa');

 var _koa2 = _interopRequireDefault(_koa);

 function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

具体而言,生成的函数_interopRequireDefault被复制到每个代码文件中,并且不一定总是执行分支,这会扭曲为istanbul发出的分支覆盖率。有没有解决这个问题的方法?

3 个答案:

答案 0 :(得分:2)

如果你正在使用gulp,我有一个gulpfile here的要点,它设置了必要的钩子和过滤器。相关的块是加载isparta,钩子需要,并让测试运行:

gulp.task('test:cover', (cb) => {
  gulp.src('src/main/**/*.js')
    .pipe(istanbul({
      instrumenter: require('isparta').Instrumenter,
      includeUntested: true
    }))
    .pipe(babel())
    .pipe(gulp.dest('target/cover'))
    .pipe(istanbul.hookRequire())
    .on('finish', cb);
});

gulp.task('test:mocha', (cb) => {
  gulp.src('target/test/**/Test*')
    .pipe(mocha())
    .pipe(istanbul.writeReports())
    .on('end', cb);
});

gulp.task('test', (cb) => {
  return runSequence('test:cover', 'test:mocha', cb);
});

唯一令人沮丧的是你的考试must use the covered code

import {
  LinearInterpolator,
  CosineInterpolator
} from '../../cover/random/Interpolators';

我还没有办法解决这个问题但却没有覆盖测试脚本和倾斜覆盖范围,尽管你应该能够通过合并流来实现这一点:

gulp.task('test:cover', (cb) => {
  const src = gulp.src('src/main/**/*.js')
    .pipe(istanbul({
      instrumenter: require('isparta').Instrumenter,
      includeUntested: true
    }));

  const test = gulp.src('src/test/**/*.js');

  merge(src, test)
    .pipe(babel())
    .pipe(gulp.dest('target/cover'))
    .pipe(istanbul.hookRequire())
    .on('finish', cb);
});

答案 1 :(得分:1)

您需要将其与isparta - this question结合使用才能使覆盖率正常运行。我警告你此刻有点反复试验!我的npm脚本看起来像 -

K msgs =  knk(2, ktn(KS, 0), ktn(KS, 0));
K syms=kK(msgs)[0];
S sym=ss("IBM");
js(&syms, sym); <-- this line seg faults

答案 2 :(得分:0)

我们遇到了这种情况,我终于厌倦了,并研究了导致这条线的原因。事实证明,每次都使用import之类的:

import chai from 'chai';

添加此babel填充以允许与较旧的导出样式进行理智的交互。麻烦的是,没有一个公共图书馆能够展示出真正的&#34;真正的&#34;三元的分支。我构建了以下文件coverInterrop.js,该文件使用老派出口人为地绊倒了第一个分支:

module.exports = {
    __esModule: true
};

并且我包含在我想要使用非结构化导入的任何文件中:

// eslint-disable-next-line no-unused-vars
import coverInterrop from 'coverInterrop';

请注意,它必须分配给一个变量才能使覆盖范围变得更好,而且好的拼图规则不会像那样