繁体   English   中英

babel生成的代码破坏了伊斯坦布尔的报道

[英]babel generated code breaking istanbul coverage

我正在使用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发出的分支覆盖范围数字产生偏差。 有什么办法解决这个问题?

如果您使用的是gulp,则此处包含一个gulpfile的要点,该文件设置了必要的钩子和过滤器。 相关的块是加载isparta ,挂接require并运行测试:

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);
});

唯一令人沮丧的部分是您的测试必须使用涵盖的代码

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);
});

您需要将其与isparta- https://github.com/douglasduteil/isparta结合使用,以使覆盖范围正常运行。 目前,我警告您进行一些尝试和错误! 我的npm脚本看起来像-

"coverage": "node_modules/.bin/babel-node node_modules/.bin/isparta cover --include-all-sources --report html node_modules/.bin/_mocha -- --reporter $npm_package_config_bdd_reporter",

我们碰到了这一点,我终于受够了,并调查了导致这条线的原因。 事实证明,每次使用类似这样的import

import chai from 'chai';

添加此通货膨胀填充以允许与较早的导出样式进行合理的交互。 麻烦的是,所有公共库都没有一个显示三元组的“ true”分支。 我构建了以下文件coverInterrop.js ,该文件使用旧式导出人为地coverInterrop.js了第一个分支:

module.exports = {
    __esModule: true
};

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

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

请注意,它必须分配一个变量才能触发覆盖,良好的eslint规则不会像那样

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM