簡體   English   中英

babel生成的代碼破壞了伊斯坦布爾的報道

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM