1
votes

I am working on getting an app set up using Angular 2 w/ typescript and I'm having issues getting my karma coverage to find the files I want it to inspect. I've set this up successfully on an angular 1.x application but there seems to be another layer I'm missing with typescript.

Everything runs just fine, I see all of my unit tests being checked by karma as expected and coverage says everything was okay and that my code has 100% coverage, which threw up a red flag. After checking the html output for coverage I saw that I have 100% coverage because no files are being checked.

Looking at the output in my terminal I see that all of the files I have selected with pattern: './src/**/*.js' are being excluded, which means it is only finding the .ts files and not compiling them into js.

I also see a message in the terminal above the coverage output that says "Not all files specified in sources could be found, continue with partial remapping."

I had added the typescriptPreprocesser thinking that it would convert the ts files into js files during testing so that the coverage tool could parse them, but nothing I've done so far is working.

Here's my karam.conf.js file in it's entirety:

var path = require('path');

var webpackConfig = require('./webpack.config');

module.exports = function (config) {
  var _config = {

    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '',

    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['jasmine'],

    // list of files / patterns to load in the browser
    files: [
      {
        pattern: './karma-shim.js',
        watched: false
      },
      {
        pattern: './src/**/*.js',
        included: true
      }
    ],

    // list of files to exclude
    exclude: [
      './src/e2e/*'
    ],

    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
    preprocessors: {
      './karma-shim.js': ['webpack', 'sourcemap'],
      './src/**/*.ts': ['typescript'],
      './src/**/*.js': ['coverage']
    },

    typescriptPreprocessor: {
      // options passed to the typescript compiler
      options: {
        sourceMap: false, // (optional) Generates corresponding .map file.
        target: 'ES5', // (optional) Specify ECMAScript target version: 'ES3' (default), or 'ES5'
        module: 'amd', // (optional) Specify module code generation: 'commonjs' or 'amd'
        noImplicitAny: true, // (optional) Warn on expressions and declarations with an implied 'any' type.
        noResolve: true, // (optional) Skip resolution and preprocessing.
        removeComments: true, // (optional) Do not emit comments to output.
        concatenateOutput: false // (optional) Concatenate and emit output to single file. By default true if module option is omited, otherwise false.
      },
      // transforming the filenames
      transformPath: function(path) {
        return path.replace(/\.ts$/, '.js');
      }
    },

    webpack: webpackConfig,

    webpackMiddleware: {
      // webpack-dev-middleware configuration
      // i. e.
      stats: 'errors-only'
    },

    coverageReporter: {
      dir: 'coverage/',
      reporters: [{
        type: 'html',
        dir: 'coverage'
      }]
    },

    remapIstanbulReporter: {
      src: 'coverage/json/coverage-final.json',
      reports: {
        lcovonly: 'coverage/json/lcov.info',
        html: 'coverage/html',
        'text': null
      },
      timeoutNotCreated: 1000, // default value
      timeoutNoMoreFiles: 1000 // default value
    },

    webpackServer: {
      noInfo: true // please don't spam the console when running in karma!
    },

    // test results reporter to use
    // possible values: 'dots', 'progress', 'mocha'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ["mocha", "coverage", "karma-remap-istanbul"],

    // web server port
    port: 9876,

    // enable / disable colors in the output (reporters and logs)
    colors: true,

    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,

    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: false,

    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['Chrome'], // you can also use Chrome

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: true
  };

  config.set(_config);

};

My terminal output incase it helps:

> karma start


START:
10 06 2016 16:32:20.696:WARN [watcher]: All files matched by "/Users/efarl1/Desktop/repos/cmg-prod/src/**/*.js" were excluded.
webpack: wait until bundle finished: 
ts-loader: Using [email protected] and /Users/efarl1/Desktop/repos/cmg-prod/tsconfig.json

webpack: bundle is now VALID.
10 06 2016 16:32:35.364:INFO [karma]: Karma v0.13.22 server started at http://localhost:9876/
10 06 2016 16:32:35.367:INFO [launcher]: Starting browser Chrome
10 06 2016 16:32:36.132:INFO [Chrome 51.0.2704 (Mac OS X 10.11.5)]: Connected on socket /#asaknUl4K3m9G7wLAAAA with id 96149396
  AppComponent
    ✔ should log ngOnInit
LOG: 'THREE.WebGLRenderer', '73'
LOG: 'THREE.WebGLRenderer', '73'
  ProductViewportComponent
    ✔ ProductViewportComponent should have an H1 with `ProductViewport Component` in it
  ProductCameraService
    ✔ should log ngOnInit
  ProductClickedObjectService
    ✔ should log ngOnInit
  ProductControlsService
    ✔ should log ngOnInit
  ProductEventsService
    ✔ should log ngOnInit
  ProductRendererService
    ✔ should log ngOnInit
  ProductService
    ✔ should log ngOnInit
  WindowService
    ✔ should log ngOnInit

Finished in 0.295 secs / 0.241 secs

SUMMARY:
✔ 9 tests completed
Not all files specified in sources could be found, continue with partial remapping.
----------|----------|----------|----------|----------|----------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
----------|----------|----------|----------|----------|----------------|
----------|----------|----------|----------|----------|----------------|
All files |      100 |      100 |      100 |      100 |                |
----------|----------|----------|----------|----------|----------------|

Any thoughts on what I'm doing wrong here?

1
I have the same 'not all files' message with Karma/Istanbul, using Typescript. All 700+ of my unit tests run, so I'm also curious what files aren't being found. - Ron Newcomb
I have the same issue, we have 1060 Unit tests - G.Vitelli

1 Answers

0
votes

I found out that the test spec needs one describe with an it and the it has one expect, then it will be shown in the coverage html.

describe('description', () => {
  it('should do something', () => {
    expect(..).toBe(...);
  }
}