2016-09-14 161 views
4

将应用程序升级到rc-7并运行我的单元测试以确保没有任何损坏之后,我在大约一半的单元测试中得到了此错误消息。ZoneAwarePromise已被覆盖

“错误:Zone.js检测到ZoneAwarePromise'(window | global).Promise'已被覆盖。 最有可能的原因是Promise polyfill已在Zone.js(Polyfilling Promise api没有必要(第21行)“

我可以想到的最接近的东西是我能想到的最接近我的东西(如果你必须加载一个,请在加载zone.js之前加载它)(node_modules/zone.js/dist/zone.js是我通过手动返回observables在单元测试中嘲笑来自http调用的响应。

这是一个使用Jasmine和Karma进行单元测试的Angular2应用程序。

UPDATE 所以它似乎这可能是一个加载顺序问题,因为每个错误消息,但我不加载任何地方polyfills我可以确定,除非我不小心抓住他们。我已附加了我的karma.conf.js和systemjs.conf.js以帮助查找错误。

Karma.conf.js

module.exports = function(config) { 
    var gulpConfig = require('../gulp/config')(); 

    /** 
    * List of npm packages that imported via `import` syntax 
    */ 
    var dependencies = [ 
    '@angular', 
    'lodash', 
    'rxjs' 
    ]; 

    var configuration = { 
    basePath: '../../', 

    browserNoActivityTimeout: 20000, 
    frameworks: ['jasmine'], 
    browsers: ['PhantomJS'], 
    reporters: ['progress', 'coverage'], 

    preprocessors: {}, 

    // Generate json used for remap-istanbul 
    coverageReporter: { 
     includeAllSources: true, 
     dir: 'coverage/appCoverage/remap/', 
     reporters: [ 
     { type: 'json', subdir: 'report-json' } 
     ] 
    }, 

    files: [ 
     'node_modules/reflect-metadata/Reflect.js', 
     'node_modules/zone.js/dist/zone.js', 
     'node_modules/zone.js/dist/long-stack-trace-zone.js', 
     'node_modules/zone.js/dist/proxy.js', 
     'node_modules/zone.js/dist/sync-test.js', 
     'node_modules/zone.js/dist/jasmine-patch.js', 
     'node_modules/zone.js/dist/async-test.js', 
     'node_modules/zone.js/dist/fake-async-test.js', 

     'node_modules/angular/angular.js', 
     'node_modules/core-js/client/shim.min.js', 
     'node_modules/systemjs/dist/system.src.js' 
    ], 

    // proxied base paths 
    proxies: { 
     // required for component assests fetched by Angular's compiler 
     "/src/": "/base/src/", 
     "/app/": "/base/src/app/", 
     "/node_modules/": "/base/node_modules/" 
    }, 

    port: 9876, 
    colors: true, 
    logLevel: config.LOG_INFO, 
    autoWatch: true, 
    //browserNoActivityTimeout: 100000 
    }; 

    configuration.preprocessors[gulpConfig.tmpApp + '**/!(*.spec)+(.js)'] = ['coverage']; 
    configuration.preprocessors[gulpConfig.tmpApp + '**/*.js'] = ['sourcemap']; 
    configuration.preprocessors[gulpConfig.tmpTest + '**/*.js'] = ['sourcemap']; 

    var files = [ 
    gulpConfig.tmpTest + 'test-helpers/global/**/*.js', 
    gulpConfig.src + 'systemjs.conf.js', 
    'config/test/karma-test-shim.js', 
    createFilePattern(gulpConfig.tmpApp + '**/*.js', { included: false }), 
    createFilePattern(gulpConfig.tmpTest + 'test-helpers/*.js', { included: false }), 
    createFilePattern(gulpConfig.app + '**/*.html', { included: false }), 
    createFilePattern(gulpConfig.app + '**/*.css', { included: false }), 
    createFilePattern(gulpConfig.app + '**/*.ts', { included: false, watched: false }), 
    createFilePattern(gulpConfig.tmpApp + '**/*.js.map', { included: false, watched: false }) 
    ]; 

    configuration.files = configuration.files.concat(files); 

    dependencies.forEach(function(key) { 
    configuration.files.push({ 
     pattern: 'node_modules/' + key + '/**/*.js', 
     included: false, 
     watched: false 
    }); 
    }); 

    if (process.env.APPVEYOR) { 
    configuration.browsers = ['IE']; 
    configuration.singleRun = true; 
    configuration.browserNoActivityTimeout = 90000; // Note: default value (10000) is not enough 
    } 

    config.set(configuration); 

    // Helpers 
    function createFilePattern(path, config) { 
    config.pattern = path; 
    return config; 
    } 
} 

UPDATE 我的解决方案涉及到确保我所有的zone.js文件被加载上次在karma.conf.js。我猜想我已经包含的其他东西还包括polyfill,但是正在zone.js之后加载,所以错误被提出。移动zone.js到最后,一切正常。

回答

3

我遇到了同样的问题。 (Angular 2 RC.7 Jasmine Karma)这是由于我在加载我的karma.conf.js中的测试文件。我装/zone.js/dist/zone.js/systemjs/dist/system-polyfills.js。改变文件的顺序以加载zone.js在systemjs polyfills解决了这个问题之后。

这是我目前在karma.conf.js中的设置,为我解决了错误。

files: [ 
    {pattern: 'dist/vendor/es6-shim/es6-shim.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/reflect-metadata/Reflect.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/systemjs/dist/system-polyfills.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/systemjs/dist/system.src.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/zone.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/proxy.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/sync-test.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/long-stack-trace-zone.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/async-test.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/fake-async-test.js', included: true, watched: false}, 
    {pattern: 'dist/vendor/zone.js/dist/jasmine-patch.js', included: true, watched: false}, 

    {pattern: 'config/karma-test-shim.js', included: true, watched: true}, 

    // Distribution folder. 
    {pattern: 'dist/**/*', included: false, watched: true} 
], 
+0

不幸的是,我不包括系统正-pollyfills.js :(我会继续和张贴我的karma.conf.js和system.conf。 js –

+1

但是,将所有我的zone.js文件移动到列表中的最后,所有内容都已解决。感谢您指点我正确的方向。 –

0

我还必须在zone.js之前包含es6-promise。 HTH。

0

只是为了增加我的经验,如果有人和我一样犯了同样的愚蠢错误。使用ng我在我的.angular-cli.jsonscripts部分如下:

... 
"scripts": [ 
    "../node_modules/bootstrap/dist/js/bootstrap.min.js", 
    "../node_modules/core-js/client/shim.min.js" 
], 
... 

我甚至不记得,所以我首先把shim.min.js那里的挫折感。但无论如何,取出后,我的测试用例现在完美运行:

... 
"scripts": [ 
    "../node_modules/bootstrap/dist/js/bootstrap.min.js" 
], 
...