javascriptkarma-runnerbrowserifykarma-coverageisparta

Issue with Karma-Browserify + Karma-Coverage


I am having issues getting karma-browserify to work with karma-coverage. I have spent a lot of time trying to figure out what is wrong, but I didn't find a solution.

Here is my .js file (the functions don't do anything; they are just mocks to test code coverage):

// src/js/utilities/form-validation.js

let includedInTest = () => true;

let alsoIncludedInTest = () => true;

let notIncludedInTest = () => true;

let alsoNotIncludedInTest = () => true;

export default {
  includedInTest,
  alsoIncludedInTest
};

This is my test file:

// src/spec/utilities/form-validation.spec.js

import formUtilities from '../../js/utilities/form-validation';

describe('Form validation functions', function () {

  it('Should return "true"', function () {
    expect(formUtilities.includedInTest()).toBe(true);
  });

  it('Should return "true"', function () {
    expect(formUtilities.alsoIncludedInTest()).toBe(true);
  });

});

Finally, this is my karma.conf:

module.exports = function(config) {
  config.set({
    basePath: '',
    frameworks: ['browserify', 'jasmine-jquery', 'jasmine'],
    files: [
      'bower_components/jquery/dist/jquery.js',
      'bower_components/jquery-validation/dist/jquery.validate.js',
      'src/js/**/*.js',
      'src/spec/**/*.spec.js'
    ],
    exclude: [
      'src/js/index.js'
    ],
    preprocessors: {
      'src/js/**/*.js': ['browserify', 'coverage'],
      'src/spec/**/*.spec.js': ['browserify']
    },
    browserify: {
      debug: true,
      transform: [
        ['babelify', { presets: ['es2015'] }]
      ]
    },
    reporters: ['mocha', 'coverage'],
    mochaReporter: {
      colors: {
        success: 'green',
        info: 'bgBlue',
        warning: 'cyan',
        error: 'bgRed'
      },
      symbols: {
        success: '√',
        info: '#',
        warning: '!',
        error: 'x'
      }
    },
    coverageReporter: {
      instrumenters: { isparta: require('isparta') },
      instrumenter: {
        'src/**/*.js': 'isparta'
      },
      dir: 'coverage',
      subdir: '.',
      reporters: [
        { type: 'html', dir: 'coverage' },
        { type: 'text-summary' }
      ],
      check: {
        global: {
          statements: 90,
          branches: 90,
          functions: 90,
          lines: 90
        },
        each: {
          statements: 90,
          branches: 90,
          functions: 90,
          lines: 90
        }
      },
      watermarks: {
        statements: [50, 75],
        functions: [50, 75],
        branches: [50, 75],
        lines: [50, 75]
      }
    },
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['PhantomJS'],
    singleRun: false,
    concurrency: Infinity
  });
};

This config yields this result:

==== Coverage summary ====
Statements   : 100% ( 1/1 )
Branches     : 100% ( 2/2 )
Functions    : 100% ( 0/0 )
Lines        : 100% ( 1/1 )
=============

This is obviously wrong since I have four functions on "form-validation.js", and I am testing two of them. But according to the summary report, there are no functions to be tested.

This line from coverage/index.html reveals only one line is being parsed by karma-coverage:

enter image description here

I also tried 'browserify-istanbul' in the transform array (and removed instrumenters from "coverageReport"):

transform: [
  ['babelify', { presets: ['es2015'] }],
  'browserify-istanbul'
]

But this generates an error:

18 08 2017 15:50:14.617:ERROR [karma]: TypeError: Cannot read property 'start' of undefined
    at /Users/gferraz/Sites/OAA-Refactor/node_modules/istanbul/lib/object-utils.js:59:44
    at Array.forEach (native)
    at Object.addDerivedInfoForFile (/Users/gferraz/Sites/OAA-Refactor/node_modules/istanbul/lib/object-utils.js:58:37)
    at Collector.fileCoverageFor (/Users/gferraz/Sites/OAA-Refactor/node_modules/istanbul/lib/collector.js:94:15)
    at /Users/gferraz/Sites/OAA-Refactor/node_modules/istanbul/lib/collector.js:108:30
    at Array.forEach (native)
    at Collector.getFinalCoverage (/Users/gferraz/Sites/OAA-Refactor/node_modules/istanbul/lib/collector.js:107:22)
    at checkCoverage (/Users/gferraz/Sites/OAA-Refactor/node_modules/karma-coverage/lib/reporter.js:148:33)
    at /Users/gferraz/Sites/OAA-Refactor/node_modules/karma-coverage/lib/reporter.js:257:32
    at Array.forEach (native)
    at Collection.forEach (/Users/gferraz/Sites/OAA-Refactor/node_modules/karma/lib/browser_collection.js:93:21)
    at /Users/gferraz/Sites/OAA-Refactor/node_modules/karma-coverage/lib/reporter.js:247:16
    at Array.forEach (native)
    at CoverageReporter.onRunComplete (/Users/gferraz/Sites/OAA-Refactor/node_modules/karma-coverage/lib/reporter.js:246:15)
    at Server.<anonymous> (/Users/gferraz/Sites/OAA-Refactor/node_modules/karma/lib/events.js:13:22)
    at emitTwo (events.js:111:20)

Any suggestions on how to fix the config file?


Solution

  • The config suggested on the correct answer of this post helped me: Karma/Istanbul Code Coverage does not find functions and always returns 100%

    Now I am getting an error on the html report ERROR [coverage]: TypeError: Cannot read property 'text' of undefined (meaning the html file I want to generate for the report is not being generated), which seems to be related to istanbul. However, I am getting the right code coverage report on my terminal window:

    enter image description here

    Strangely enough, the error doesn't happen every time the tests run, so I am able to get the html file just fine sometimes.

    Here is the karma.conf that solved the problem addressed on my question:

    module.exports = function(config) {
      config.set({
        basePath: '',
        frameworks: ['browserify', 'jasmine-jquery', 'jasmine'],
        files: [
          'bower_components/jquery/dist/jquery.js',
          'bower_components/jquery-validation/dist/jquery.validate.js',
          'src/js/**/*.js',
          'src/spec/**/*.spec.js'
        ],
        exclude: [
          'src/js/index.js'
        ],
        preprocessors: {
          'src/js/**/*.js': ['browserify'],
          'src/spec/**/*.spec.js': ['browserify']
        },
        browserify: {
          debug: true,
          extensions: ['.js'],
          configure: (bundle) => {
            bundle.transform('babelify', { presets: ['es2015'] });
            bundle.transform(require('browserify-istanbul')({
              ignore: ['**/spec/**']
            }));
          }     
        },
        reporters: ['mocha', 'coverage'],
        coverageReporter: {
          dir: 'coverage',
          subdir: '.',
          reporters: [
            { type: 'html', dir: 'coverage' },
            { type: 'text-summary' }
          ],
    
          etc...
        }
      });
    };