[英]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.