用Karma和Jasmin进行Angular2单元测试

时间:2016-04-04 16:01:53

标签: unit-testing angular karma-jasmine

我正在努力让我的Angular2单元测试运行起来。 我猜这与我的模块加载有关。

这是我得到的错误: 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

这是我的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
})
};

这是我的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);
       });
}

如您所见,我将所有/public/路径重定向到/base/public/以处理Karma默认/base/份文件。

我仔细检查了抛出404的文件的路径,它存在于提供的路径中(减去/base/)。

有人能指出我在这方面可能出现的问题吗?

THX!

0 个答案:

没有答案