angular - JEST 和 AGM 模块的意外 token 导出

标签 angular jasmine jestjs

我正在使用 Jasmine 为 Angular 编写测试。 在测试使用 AGM 的组件时,出现以下错误:

C:\Path\node_modules\@agm\core\index.js:1
({"Object.<anonymous>":function(module,exports,require,__dirname,__filename, global,jest){export * from './directives';
         ^^^^^^
SyntaxError: Unexpected token export

知道我的测试 component.spec.ts 是空的并且还没有测试任何东西。

最佳答案

这个解决方案应该有效:

您需要在您的开发依赖项中安装 3 个新包(如果您没有):

npm install --save-dev @babel/core @babel/cli @babel/preset-env

然后你需要在根项目中创建一个名为.babelrc的文件并添加这一行:

{ "presets": ["@babel/preset-env"] }

下一步是添加一个 npm 脚本,该脚本将运行 babel 以编译 ES2015 中的 js 文件。打开您的 package.json 将其添加到脚本部分:

"compile_@agm_core": "babel node_modules/@agm/core -d node_modules/@agm/core --presets @babel/preset-env"

此脚本必须在 npm 安装后运行,因此请将此行也添加到 package.json 的脚本部分:

"postinstall": "npm run compile_@agm_core",

完成后,运行 npm install,您将看到如下内容:

babel node_modules/@agm/core -d node_modules/@agm/core --presets @babel/preset-env Successfully compiled 35 files with Babel.

第二部分是测试使用 AGM 导入的组件。我实际上不知道你是如何使用它的,但这是逻辑:

my-agm-component.ts :

import { Component, ElementRef, NgZone, OnInit, ViewChild } from '@angular/core';
import { MapsAPILoader } from '@agm/core';

@Component({
    selector: 'app-my-agm-component',
    templateUrl: './my-agm.component.html'
})
export class MyAgmComponent implements OnInit {
    public latitude: number = 39.8282;
    public longitude: number = -98.5795;
    public zoom: number = 4;
    @ViewChild('search')
    public searchElementRef: ElementRef;

    constructor(private mapsAPILoader: MapsAPILoader, private ngZone: NgZone) {
    }

    ngOnInit(): void {
        this.loadGMAP();
    }

    private async loadGMAP(): Promise<void> {
        await this.mapsAPILoader.load();
        this.listenGMAPSearch();
    }

    private listenGMAPSearch(): void {
        const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, {
            types: ['address']
        });

        autocomplete.addListener('place_changed', () => {
            this.ngZone.run(() => {
                this.onPlaceChanged(autocomplete.getPlace());
            });
        });
    }

    private onPlaceChanged(place: google.maps.places.PlaceResult): void {
        if (!place.geometry) {
            return;
        }

        // handle addr from place.geometry here
    }
}

my-agm-component.spec.ts :

我不是 Jest 使用 mocha,但这是我测试组件初始化的方式。您应该能够运行规范文件而不会出现意外的 token 导出错误。

import { NgZone } from '@angular/core';
import { stubClass, expect, stub } from '../../../../../../test';
import { MyAgmComponent } from './my-agm.component';

describe('MyAgmComponent', () => {
    let component: MyAgmComponent, mapsAPILoader: any, ngZone: NgZone;

    beforeEach(() => {
        // mocking mapsAPILoader
        mapsAPILoader = <any>{load: () => Promise.resolve({})};

        // spying load method call
        stub(mapsAPILoader, 'load').returns(null);

        // initializing component
        component = new MyAgmComponent(
            mapsAPILoader,
            ngZone = stubClass(NgZone)
        );
    });

    it('should init the component', () => {
        return expect(component).to.not.be.undefined;
    });
});

我知道这是一篇很长的文章,但我希望它对您有所帮助。此解决方案基于 this github thread .

关于angular - JEST 和 AGM 模块的意外 token 导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52226226/

相关文章:

html - 如何在使用图像映射创建的特定区域添加图钉

angular - mat-error 放置到单独的组件无法正确呈现

angular - 通过 mixpanel 中的错误构建 iOS 应用程序

javascript - 如何使用 Chai/Sinon 重构 jasmine.any() 功能

javascript - 用于 Angular 测试的 JS 堆内存不足

javascript - 为什么 Jest 在没有标志 --runInBand 的情况下会失败?

Angular Aot 错误 - 如何使用对导出函数的引用替换函数

angularjs - Protractor 中的 addMockModule 未添加 $httpBackend 模块

使用 Jasmine 进行测试时,Angularjs 注入(inject) Controller 为空

reactjs - 无效的 Chai 属性 : toMatchSnapshot -- React. js Jest 测试