使用 Angular2 beta 和 SystemJS 在 Karma 单元测试中加载 angular2-polyfilles.js 时出现 _setAsap 错误

_setAsap error when loading angular2-polyfilles.js in Karma unit test with Angular2 beta and SystemJS

当 运行 Karma 单元测试时,出现以下错误:

Chrome 47.0.2526 (Linux 0.0.0) ERROR
Uncaught TypeError: Cannot read property '_setAsap' of undefined
Evaluating path/node_modules/angular2/bundles/angular2-polyfills.min.js
Error loading path/node_modules/angular2/bundles/angular2-polyfills.min.js

karma.conf.js 包含如下内容:

// Karma configuration
// Generated on Tue Dec 08 2015 14:19:08 GMT-0600 (CST)
module.exports = function(config) {
    config.set({
        // base path that will be used to resolve all patterns (eg. files, exclude)
        basePath: '../',
        files: [
            'node_modules/angular2/bundles/angular2-polyfills.min.js',
            'node_modules/es6-shim/es6-shim.js',
            'node_modules/systemjs/dist/system.js',
            'node_modules/rxjs//Rx.js',
            'node_modules/angular2/bundles/angular2.min.js',
            'dist/components/uploader.js',
            'dist/components/uploader.spec.js'
        ],
        ...

uploader.js 是来自 TypeScript 的已编译 JavaScript 文件,是一个 Angular2 组件。 Uploader.spec.js 是单元测试。我使用 Karma、SystemJS 和 Angular2 beta 来尝试设置单元测试。

查看 _angular2_polyfills.js_ 时,_setAsap 似乎指向模块 es6-promise。但是,即使我将 node_modules/es6-promise/dist/es6-promise.js 添加到文件列表中,它也不起作用。

所以,我遇到了类似的问题,我不得不将其添加到我的 system.conf.js 文件中:

System.config({
    paths: {
        'agular2-polyfills': 'node_modules/angular2/bundles/angular2-polyfills.js',
        'typescript': 'node_modules/typescript/lib/typescript.js',
        'systemjs': 'node_modules/systemjs/dist/system.js',
        'system-polyfills': 'node_modules/systemjs/dist/system-polyfills.js',
        'es6-module-loader': 'node_modules/es6-module-loader/dist/es6-module-loader.js'
    },
    map: {
        angular2: 'node_modules/angular2',
        rxjs: 'node_modules/rxjs',
        crypto: '@empty'// this fixed my last issue
    },
    meta: {
        'path/to/components/*': {
            format: 'register'
        }
    }
});

如果我没记错的话(我并没有声称自己是 systemjs ninja) after looking through several stack questions and reading the config docs,我找到了这个解决方案,但我不记得其中的一些原因,除了与必须使用业力加载所有内容。

我的 karma.conf 文件数组:

// list of files / patterns to load in the browser
    files: [
      'node_modules/reflect-metadata/Reflect.js',
      '*.spec.js',
      '**/*.spec.js',
      '**/**/*.spec.js'
    ]

和 karma.conf systemjs 配置:

systemjs: {
    // Path to your SystemJS configuration file 
    configFile: 'system.conf.js',

    // Patterns for files that you want Karma to make available, but not loaded until a module requests them. eg. Third-party libraries. 
    serveFiles: [
        'client/**/*.js',
        'server/**/*.js',
    ],

    // SystemJS configuration specifically for tests, added after your config file. 
    // Good for adding test libraries and mock modules 
    config: {
        transpiler: null,
        defaultJSExtensions: true
    },

    meta: {
        'angular2/angular2':{
            format: 'register'
        }
    }
},

重要提示 这可能不是最好的方法,甚至不是最接近的方法,但这就是 I 使它工作的方式。我还没有完成项目这部分的重构阶段,因为我会在 完成项目的第一阶段后进行重构。

祝你好运!