2016-08-09 95 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規則不會那樣

相關問題