我正在使用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是空的,还没有测试任何东西。
答案 0 :(得分:0)
此解决方案应该有效:
您需要在自己的开发依赖项中安装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安装,您将看到类似这样的内容:
babel node_modules / @ agm / core -d node_modules / @ agm / core --presets @ babel / preset-env 使用Babel成功编译了35个文件。
第二部分是测试使用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开玩笑,但这是测试组件初始化的方式。您应该能够运行规范文件,而不会出现意外的令牌导出错误。
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。