lundi 4 avril 2016

Angular2 Unit Test with Karma and Jasmin

I'm struggling getting my Angular2 Unit Tests up and running. I'm guessing it has something to do with my module loading.

This is the error I'm getting: WARN [web-server]: 404: /base/public/dev/assets/lib/node_modules/angular2/src/platform/browser/browser_adapter.js Missing error handler on socket. TypeError: (msg || "").replace is not a function

This is my karma.config.js

module.exports = function(config) {
config.set({

    basePath: ".",

    frameworks: ["jasmine"],

    files: [
        // paths loaded by Karma
        { pattern: "public/dev/assets/lib/node_modules/angular2/bundles/angular2-polyfills.js", included: true, watched: true },
        { pattern: "public/dev/assets/lib/node_modules/systemjs/dist/system.src.js", included: true, watched: true },
        { pattern: "public/dev/assets/lib/node_modules/rxjs/bundles/Rx.js", included: true, watched: true },
        { pattern: "public/dev/assets/lib/node_modules/angular2/bundles/angular2.dev.js", included: true, watched: true },
        { pattern: "public/dev/assets/lib/node_modules/angular2/bundles/testing.dev.js", included: true, watched: true },
        { pattern: "karma-test-shim.js", included: true, watched: true },

        // paths loaded via module imports
        { pattern: "public/dev/assets/scripts/app/**/*.js", included: false, watched: true },

        // paths to support debugging with source maps in dev tools
        { pattern: "public/dev/assets/scripts/app/**/*.ts", included: false, watched: false },
        { pattern: "public/dev/assets/scripts/app/**/*.js.map", included: false, watched: false }
    ],

    // proxied base paths
    proxies: {
        // required for component assests fetched by Angular"s compiler
        // Redirect all "/public/" paths to "/base/public" (Karma serves files from /base/)
        "/public/": "/base/public/"
    },

    port: 9876,

    logLevel: config.LOG_INFO,

    colors: true,

    autoWatch: true,

    browsers: ["Chrome"],

    // Karma plugins loaded
    plugins: [
        "karma-jasmine",
        "karma-coverage",
        "karma-chrome-launcher"
    ],

    // Coverage reporter generates the coverage
    reporters: ["progress", "dots", "coverage"],

    // Source files that you wanna generate coverage for.
    // Do not include tests or libraries (these files will be instrumented by Istanbul)
    preprocessors: {
        "public/dev/assets/scrips/app/**/!(*spec).js": ["coverage"]
    },

    coverageReporter: {
        reporters:[
            {type: "json", subdir: ".", file: "coverage-final.json"}
        ]
    },

    singleRun: true
})
};

This is my karma-test-shim.js

// Tun on full stack traces in errors to help debugging
Error.stackTraceLimit = Infinity;

jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;

// // Cancel Karma's synchronous start,
// // we will call `__karma__.start()` later, once all the specs are loaded.
__karma__.loaded = function() {};

System.config({
  defaultJSExtensions: true,
  map: {
    angular2: "public/dev/assets/lib/node_modules/angular2",
    rxjs: "public/dev/assets/lib/node_modules/rxjs"
  },
  packages: {
    'base/public': {
      format: 'register',
      map: Object.keys(window.__karma__.files)
                 .filter(onlyAppFiles)
                 .reduce(createPathRecords, {})
    }
  }
});

System.import('angular2/src/platform/browser/browser_adapter')
   .then(function(browser_adapter) { browser_adapter.BrowserDomAdapter.makeCurrent(); })
   .then(function() { return Promise.all(resolveTestFiles()); })
   .then(function() { __karma__.start(); }, function(error) { __karma__.error(error.stack || error); });

function createPathRecords(pathsMapping, appPath) {
   // creates local module name mapping to global path with karma's fingerprint in path, e.g.:
   // './vg-player/vg-player':
   // '/base/dist/vg-player/vg-player.js?f4523daf879cfb7310ef6242682ccf10b2041b3e'
   var pathParts = appPath.split('/');
   var moduleName = './' + pathParts.slice(Math.max(pathParts.length - 2, 1)).join('/');
   moduleName = moduleName.replace(/\.js$/, '');
   pathsMapping[moduleName] = appPath + '?' + window.__karma__.files[appPath];
   return pathsMapping;
}

function onlyAppFiles(filePath) {
   return /\/base\/public\/dev\/assets\/(?!.*\.spec\.js$).*\.js$/.test(filePath);
}

function onlySpecFiles(path) {
   return /\.spec\.js$/.test(path);
}

function resolveTestFiles() {
   return Object.keys(window.__karma__.files)  // All files served by Karma.
       .filter(onlySpecFiles)
       .map(function(moduleName) {
           // loads all spec files via their global module names (e.g.
           // 'base/dist/vg-player/vg-player.spec')
           return System.import(moduleName);
       });
}

As you can see I'm redirecting all /public/ paths to /base/public/ to handle the Karma default /base/ serving of files.

I double checked the path of the file that throws the 404, and it exists in the path provided (minus the /base/).

Can anyone point me in the right direction as to what may be going wrong here?

Thx!

Aucun commentaire:

Enregistrer un commentaire