[英]Sourcemap + istanbul/isparta code coverage for a webpack + babel (for es6) + mocha (+karma)
[英]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.