Неожиданный экспорт токенов для модуля JEST & AGM - PullRequest
0 голосов
/ 07 сентября 2018

Я пишу тесты, используя Jasmine для угловых. При тестировании моего компонента, использующего 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 пуст и еще ничего не тестирует.

1 Ответ

0 голосов
/ 09 января 2019

Это решение должно работать:

Вам нужно установить 3 новых пакета в ваших зависимостях dev (если у вас их нет):

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

Затем вам нужно создатьфайл с именем .babelrc в корневой проект и добавьте следующую строку:

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

Следующим шагом является добавление сценария npm, который будет запускать babel для компиляции js-файлов в ES2015.Откройте файл package.json и добавьте его в раздел сценариев:

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

Этот сценарий необходимо запустить после установки npm, поэтому добавьте эту строку в раздел сценариев своего пакета.json тоже:

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

Как только вы это сделаете, запустите npm install , и вы увидите что-то вроде:

babel node_modules / @ agm / core-d node_modules / @ agm / core --presets @ babel / preset-env Успешно скомпилировали 35 файлов с помощью 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:

Я использую mocha, а не jest, но так я тестирую инициализацию моего компонента.Вы должны быть в состоянии запустить ваш spec-файл без неожиданной ошибки экспорта токена.

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;
    });
});

Я знаю, что это длинный пост, но я надеюсь, что он был полезен.Это решение основано на этом потоке github .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...