【问题标题】:ReferenceError: Can't find variable: MapReferenceError:找不到变量:地图
【发布时间】:2023-03-22 13:16:01
【问题描述】:

我正在使用 Angular 4、Webpack 2.4.1、Karma 1.6 和 Jasmine 2.6.1,并且正在编写 ES2015 not TypeScript

我有一个很小的 ​​Angular 演示应用程序,我想添加单元测试。演示应用程序本身正在运行,并且 Webpack 正在正确捆绑所有内容,但是当我尝试运行单元测试时,我在控制台中看到一些错误,如下所示:

ReferenceError:找不到变量:地图

在静态/js/app.welcome.js:2569

app.welcome.js 是我的组件的名称)

Webpack 似乎正在正确构建我的测试包,Karma 服务器正在正确启动并且 PhantomJS 正在正确启动,但随后我看到了一些 Map 错误。

肯定不在我自己的代码中使用 Map() 构造函数。

这是我的文件 -

app.welcome.js

import {Component} from '@angular/core';

class WelcomeComponent {
    constructor () {
        this.welcomeMessage = 'Welcome to Angular 4';
    }
}

WelcomeComponent.annotations = [
    new Component({
        selector: 'my-app',
        template: '<h1>{{welcomeMessage}}</h1>'
    })
];

export {WelcomeComponent};

app.welcome.spec.js

import {TestBed} from '@angular/core/testing';
import {WelcomeComponent} from '../../js/app.welcome';

describe('The Welcome component', function () {

    let component;

    beforeEach(function() {
        TestBed.configureTestingModule({
            declarations: [WelcomeComponent]
        });

        const fixture = TestBed.createComponent(WelcomeComponent);
        component = fixture.componentInstance;
    });

    it('should be a component', function() {
        expect(component).toBeDefined();
    });

    it('should have a welcome message', function () {
        expect(component.welcomeMessage).toEqual('Welcome to Angular 4');
    });

});

karma.conf.js

const webpack = require('webpack');

module.exports = function(config) {
    config.set({
        basePath: '',
        frameworks: ['jasmine'],
        files: [
            './Static/js/**/*.js',
            './Static/test/**/*.spec.js'
         ],
         exclude: [
             './Static/js/main.js'
         ],
         preprocessors: {
             './Static/js/**/*.js': ['webpack'],
             './Static/test/**/*.spec.js': ['webpack']
         },
         reporters: ['progress'],
         port: 9876,
         colors: true,
         logLevel: config.LOG_INFO,
         autoWatch: false,
         browsers: ['PhantomJS'],
         singleRun: true,
         concurrency: Infinity,
         webpack: {
             module: {
                 rules: [{
                     test: /\.js$/,
                     use: [{
                         loader: 'babel-loader',
                         options: { presets: ['es2015'] }
                     }]
                 }]
             },
             plugins: [
                 new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)@angular/, './src')
             ]
         }
     })
}

在阅读此处的其他答案后,我尝试将导入添加到我的测试文件中,例如 import 'zone.js';import 'core-js/es6';,但这并没有帮助。

我查看了Testing -ts - GUIDE,我似乎没有遗漏早期基本示例中的任何重要内容,但问题是所有官方文档都面向 TypeScript,而我想使用 ES2015。

我了解 Map 是 ES2015 中的一种新型对象,而不是错误所指示的变量。 Babel 不应该支持这个吗?

谁能帮忙?

【问题讨论】:

    标签: javascript angular jasmine karma-runner webpack-2


    【解决方案1】:

    由于浏览器中没有Map,因此引发此错误。 PhantomJS 用作 Karma 驱动,不支持 ES6 特性。

    如果测试中包含的文件中没有加载 polyfill(例如 core-js),则应单独加载它们,例如通过 karma-es6-shim 插件:

        ...
        frameworks: ['es6-shim', 'jasmine'],
        ...
    

    【讨论】:

    • 谢谢,我试过了,但由于 es6-shim 不支持 WeakMap,消息刚刚更改为 ReferenceError: Can't find variable: WeakMap。现在大多数浏览器都支持地图,令人难以置信的是,根据 Kangax 的说法,即使 IE11 也有基本的支持!而且,Babel via Webpack 不应该为这些东西提供支持吗?
    • 不,Babel 不应该。有Babel polyfill,应该是手动加载的。见github.com/babel/karma-babel-preprocessor#polyfill。是的,PhantomJS 很简单,但没有人强迫你将它与 Karma 一起使用。如果需要,您可以改用 Chrome 驱动程序。请参阅 github.com/paulmillr/es6-shim#weakmap-shim 了解为什么它不包含在 es6-shim 中。
    • 嗯,Babel Webpack 插件的全部目的是将 ES2015 -> ES5 转换为捆绑的一部分。但我会尝试 Chrome 浏览器而不是 PhantomJS。我听说 Chrome 无头是新的热点 :)
    • 确实,它会转译所有无法填充的代码。并且应该注意的是,有些东西根本无法 polyfill(比如 Proxy)。如果 Babel 强行应用所有 polyfill,没有人会高兴,这会产生比它解决的问题更多的问题。我还没有尝试过无头 Chrome,但有头 Chrome 已经做了很长时间了。
    • 我已经尝试了几种不同的方法,但现在每次运行都会出现一个不确定的单元测试失败。这是否存在顺序或时间依赖性?我看到的确切消息是:ReferenceError: Can't find variable: Map thrown
    【解决方案2】:

    这对我有用: 我使用 PhantonJskarmanightwatch 进行测试。我在 JhantomJs 初始化和测试开始时遇到了这个错误,因为浏览器中没有 Map。 PhantomJS 用作 Karma 驱动,不支持 ES6 特性。

    我尝试加载 polyfill,但这也无济于事。 然后我看到对 PhantonJs 的支持早就消失了,觉得它不会起作用。所以我努力用 Chrome 无头浏览器替换 PhantomJs,令人惊讶的是它很容易替换。

    以下是我将 PhantomJs 更改为无头 Chrome 所做的事情:

    1. Package.json - puppeteer、chromedriver、karma-chrome-launcher 作为依赖项
    2. 在 karma.conf.js 中添加以下内容
    const puppeteer = require('puppeteer');
    process.env.CHROME_BIN = puppeteer.executablePath();
    
    module.exports = function(config) {
      config.set({ 
        .
        browsers: ['ChromeHeadless'],
        .
       });
    
    
    1. 在 nightwatch.json 中添加/编辑以下内容
        "chrome": {
          "desiredCapabilities": {
            "browserName": "chrome",
            "javascriptEnabled": true,
            "acceptSslCerts": true,
            "chromeOptions": {
              "args": ["--no-sandbox", "headless"]
            }
          }
    

    这对我有用;取决于您使用 JhantomJs 进行测试的副产品类型,可能对您有用,也可能对您不起作用。不过应该对任何试图摆脱 PhantomJs 的人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-20
      • 2018-04-24
      • 2016-10-30
      • 2012-03-18
      • 2015-11-16
      • 2011-05-22
      • 2014-12-16
      • 2022-01-23
      相关资源
      最近更新 更多