首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Browserify、Babel和Coverage在Karma中协同工作?

如何让Browserify、Babel和Coverage在Karma中协同工作?
EN

Stack Overflow用户
提问于 2016-01-21 12:00:14
回答 3查看 3.4K关注 0票数 8

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

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

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

代码语言:javascript
复制
require('/absolute/path/to/the/corresponding/file.js');

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

这是我的karma.conf.js:

代码语言:javascript
复制
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在源文件上运行,将结果链接文件提供给源映射生成器,然后源映射生成器将结果提供给karma-coverage。但是在Browserify和处理复盖范围的东西之间有一些通信丢失。Isparta (在幕后使用伊斯坦布尔)不知道browserify正在运行,我也不知道它看到了什么。

如果任何人有使用适当代码覆盖率测试模块化ES6的经验,请让我知道我是否在正确的轨道上,或者我是否应该尝试其他东西。

EN

回答 3

Stack Overflow用户

发布于 2016-01-22 22:30:29

这是为我工作的配置,请注意,我使用的是browserify-istanbul而不是isparata。

代码语言:javascript
复制
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
    });
};

开始工作是一个巨大的痛苦。

希望这能有所帮助

票数 5
EN

Stack Overflow用户

发布于 2016-08-05 07:42:08

操作方法: Karma + Babel + React + Browserify +伊斯坦布尔

我想我明白了。

如果我不知道,就ping我gus+overflow@mythril.co

不确定上一个不起作用的答案是否与使用jasmine而不是mocha有关,但我通过这些设置得到了它。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "presets": ["es2015", "react"],
  "sourceMap": "inline"
}

karma.config.js:

代码语言:javascript
复制
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' }
      ]
    }
  });
};
票数 2
EN

Stack Overflow用户

发布于 2016-08-16 19:44:35

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

代码语言:javascript
复制
// 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?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34915177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档