我使用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
发出的分支覆盖率。有没有解决这个问题的方法?
答案 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';
请注意,它必须分配给一个变量才能使覆盖范围变得更好,而且好的拼图规则不会像那样