2016-08-09 94 views
2

我使用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

你用什么作为测试跑步者? (如果有的话) – Neal

+0

使用gulp和mocha,与@ssube在 – Kevin

回答

1

您需要将它与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", 
+0

下显示的设置非常相似,它是'isparta'完全不同的覆盖工具(而不是'istanbul')?我可能会考虑它,但通常现在一切正常,因为除了导入/导出之外,节点6.2几乎支持es6中的所有内容。所以我使用babel是最小的,单一的生成函数是我唯一的实际问题。它看起来像'istanbul'有办法忽略某些行,但只有代码注释(例如'/ * istanbul忽略下一个* /'),但这并没有完全切断它,因为我不控制代码生成。 – Kevin

+0

@凯文我的理解是,它在引擎盖下使用伊斯坦布尔。 – dmoo

2

如果您使用一饮而尽,我有一个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); 
}); 
0

我们碰到的THI我终于厌倦了,并且看到了导致这条线路的原因。事实证明,每一次使用import像:

import chai from 'chai'; 

这个通天塔填料被添加到允许与旧出口风格稳健的互动。麻烦的是,没有一个共同的图书馆展示三元的“真实”分支。我建立以下文件coverInterrop.js,使用老派的出口人为地旅行的第一个分支:

module.exports = { 
    __esModule: true 
}; 

,我包括在任何文件,我想用一个undestructured进口:

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

注意它必须指定一个变量来覆盖覆盖范围,并且好的eslint规则不会那样

相关问题