【问题标题】:How to get Browserify, Babel, and Coverage working together in Karma?如何让 Browserify、Babel 和 Coverage 在 Karma 中协同工作?
【发布时间】:2016-01-21 04:00:13
【问题描述】:

我越来越厌倦尝试让节点库一起正常工作,但这是工作的一部分,所以就这样吧。

我有一个用于浏览器的 ES6 应用程序。当我的应用程序用 ES5 编写时,我对我的文件进行了一组单元测试。我使用 Browserify 来处理导入/导出模块和捆绑我的发行版。在浏览器中运行应用程序时,这可以正常工作。我可以成功地浏览源文件和规范文件并运行测试,并且测试通过了。我非常接近让这个工作。

唯一的问题是覆盖范围。我最接近的是显示 karma-browserify 生成的文件的覆盖范围,每个文件看起来像这样:

require('/absolute/path/to/the/corresponding/file.js');

而且覆盖率显然显示为所有文件的 100%,因为每个文件只有一行。

这是我的 karma.conf.js:

import babelify from 'babelify';
import isparta  from 'isparta';
import paths    from './paths';

var normalizeBrowserName = (browser) => browser.toLowerCase().split(/[ /-]/)[0];

export default function(config) {
    config.set({
        basePath: '..',
        browsers: ['PhantomJS'],
        frameworks: ['browserify', 'jasmine'],
        files: paths.test.files,
        preprocessors: {
            'app/**/*.js': ['browserify', 'sourcemap', 'coverage'],
            [paths.test.testFiles]: ['babel'],
        },
        plugins: [
            'karma-babel-preprocessor',
            'karma-browserify',
            'karma-coverage',
            'karma-jasmine',
            'karma-junit-reporter',
            'karma-phantomjs-launcher',
            'karma-sourcemap-loader',
        ],
        autoWatch: false,
        colors: false,
        loggers: [{ type: 'console' }],
        port: 9876,
        reporters: ['progress', 'dots', 'junit', 'coverage'],
        junitReporter: {
            outputFile: paths.test.resultsOut,
            suite: '',
        },
        browserify: {
            debug: true,
            noParse: paths.js.noparse(),
            configure: (bundle) => {
                bundle.once('prebundle', () => bundle.transform(babelify.configure({ ignore: 'lib/!**!/!*' })));
            },
        },
        coverageReporter: {
            instrumenters: { isparta },
            instrumenter: {
                [paths.test.cover]: 'isparta',
            },
            reporters: [
                { type: 'text', },
                { type: 'html', dir: paths.test.coverageOut, subdir: normalizeBrowserName },
                { type: 'cobertura', dir: paths.test.coverageOut, subdir: '.', file: 'coverage.xml' },
            ],
        },
        logLevel: config.LOG_DEBUG,
    });
};

我真的不知道这些库是如何工作的,所以我不知道从哪里开始调试它。我知道预处理器的顺序很重要,因此 Browserify 在源文件上运行,将生成的链接文件提供给源映射生成器,然后源映射生成器将生成的任何内容提供给业力覆盖。但是 Browserify 和任何处理覆盖范围的东西之间存在一些通信损失。 Isparta(在幕后使用伊斯坦布尔)不知道 browserify 正在运行,我不知道它看到了什么。

如果有人在测试具有适当代码覆盖率的模块化 ES6 方面有任何经验,请告诉我我是否走在正确的轨道上,或者我是否应该尝试其他方法。

【问题讨论】:

    标签: karma-runner babeljs code-coverage browserify isparta


    【解决方案1】:

    这是对我有用的配置,请注意我使用的是 browserify-istanbul 而不是 isparata。

    var istanbul = require('browserify-istanbul');
    
    module.exports = function(config) {
        config.set({
            basePath: '',
            frameworks: ['browserify', 'mocha'],
            files: [
              'test/**/*Spec.js'
            ],
            exclude: [
              '**/*.sw?'
            ],
            preprocessors: {
              'test/**/*Spec.js': ['browserify', 'coverage']
            },
            browserify: {
              debug: true,
              transform: [
                ['babelify', {
                  ignore: /node_modules/
                }],
                istanbul({
                  ignore: ['test/**', '**/node_modules/**']
                })
              ],
              extensions: ['.jsx']
            },
    
            babelPreprocessor: {
              options: {
                sourceMap: 'inline'
              },
               sourceFileName: function(file) {
                return file.originalPath;
              }
            },
            coverageReporter: {
              dir: 'coverage/',
              reporters: [
                { type: 'text-summary' }
              ]
            },
            browserNoActivityTimeout: 180000,
            reporters: ['coverage', 'progress'],
            port: 9876,
            colors: true,
            logLevel: config.LOG_INFO,
            autoWatch: true,
            browsers: ['Chrome'],
            singleRun: false
        });
    };
    

    开始工作非常痛苦。

    希望对你有帮助

    【讨论】:

    • 我将 html 输出压缩为排除/导入,因此,每次它说所有文件都有测试时,它不是真的。 html 报告中的所有文件都包含typeof require === "function" && require(MY-FILE)
    • 这对我有帮助,但我不得不稍微调整一下。例如,在preprocessors: [] 中,我没有像您那样使用单个条目,而是将我的 src 和我的测试文件分成两个条目,因为我不想在自己的测试中运行“覆盖”预处理器,否则我会测量测试文件本身的覆盖率。我还必须进行其他调整...如果以后有时间我会发布我的解决方案。
    【解决方案2】:

    如何:Karma + Babel + React + Browserify + Istanbul

    我想我明白了。

    如果我不这样做,请联系我 gus+overflow@mythril.co

    不确定之前的答案是否不起作用与使用茉莉而不是摩卡有关,但我可以使用这些设置。

    必需的包:除了显而易见的(React、Karma、Jasmine、Browserify)

    isparta             - an Istanbul instrumenter for ES6
    browserify-istanbul - a browserify transform
    babelify            - another browserify transform
    babel               - JS compiler
    babel-preset-2015   - ES6 compile preset
    babel-preset-react  - React compile preset
    

    在你的根目录中创建一个 .babelrc 文件。 我对在工具中放置 babel 选项的位置感到非常困惑,但大多数(以及这些)babel 工具寻找.babelrc

    {
      "presets": ["es2015", "react"],
      "sourceMap": "inline"
    }
    

    karma.config.js:

    const isparta = require('isparta');
    const istanbul = require('browserify-istanbul');
    
    module.exports = function (config) {
      config.set({
    
        basePath: '',
    
        browsers: ['Firefox', 'Chrome', 'PhantomJS', 'Safari'],
    
        captureConsole: true,
    
        clearContext: true,
    
        colors: true,
    
        files: [
    
          // you need this for Phantom
          'node_modules/phantomjs-polyfill/bind-polyfill.js',
    
          // import any third party libs, we bundle them in another gulp task
          './build/libs/vendor-bundle.js',
    
          // glob for spec files
          '__PATH_TO_SPEC_FILES_/*.spec.js'
        ],
    
        frameworks: ['jasmine', 'browserify'],
    
        logLevel: config.LOG_INFO,
    
        preprocessors: {
    
          // I had to NOT include coverage, the browserify transform will handle it
          '__PATH_TO_SPEC_FILES_/*.spec.js': 'browserify'
        },
    
        port: 9876,
    
        reporters: ['progress', 'coverage'],
    
        browserify: {
    
          // we still use jQuery for some things :(
          // I don't think most people will need this configure section
          configure: function (bundle) {
            bundle.on('prebundle', function () {
              bundle.external(['jquery']);
            });
          },
    
          transform: [
    
            // this will transform your ES6 and/or JSX
            ['babelify'],
    
            // (I think) returns files readable by the reporters
            istanbul({
              instrumenter: isparta, // <--module capable of reading babelified code 
              ignore: ['**/node_modules/**', '**/client-libs/**']
            })
          ],
    
          // our spec files use jsx and so .js will need to be compiled too
          extensions: ['.js', '.jsx'],
    
          // paths that we can `require()` from
          paths: [
            './node_modules',
            './client-libs',
            './universal'
          ],
    
          debug: true
        },
    
        coverageReporter: {
          reporters: [
            { type: 'html', dir: 'coverage/Client' },
            { type: 'text-summary' }
          ]
        }
      });
    };
    

    【讨论】:

    • 如果不设置覆盖预处理器,我无法使其工作,并且转换失败,最终得到了您的答案和 Derek 的答案的混合。
    【解决方案3】:

    使用 Karma,我认为它看起来像这样(?):

    // Karma configuration
    'use strict';
    
        let babelify = require( 'babelify' );
        let browserify = require('browserify');
        let browserifyBabalIstanbul = require('browserify-babel-istanbul');
        let isparta = require('isparta');
    
        browserify: {
                    debug: true,
                    transform: [
                        browserifyBabalIstanbul({
                            instrumenter: isparta,
                            instrumenterConfig: { babel: { presets: ["es2015"] } },
                            ignore: ['**/node_modules/**', '**/unitest/**']
                        }),
                        [ babelify, { presets: ["es2015"] } ]
                    ]
                },
    

    查看以下链接:Find a good way to get a coverage report with karma?

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 2020-01-17
      • 2017-11-15
      • 2020-01-13
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多