【发布时间】:2018-04-11 20:40:19
【问题描述】:
您好,我正在尝试为以下 Angular 服务编写 jasmine 单元测试。
但是,我在为如何编写返回承诺值的测试而苦苦挣扎,并且无法找到任何详细的资源如何为这些情况编写。
大部分困难来自于不知道如何测试返回的承诺中调用的内容。
例如,我想测试调用this.createMap() 调用this._mapResolver 与地图实例new google.maps.Map(el, mapOptions)
Angular 2+ 的专家能否帮助我理解 Promise 的编写规范?或者可以借鉴的参考资料?
declare let google: any;
/**
* Wrapper class that handles the communication with the Google Maps Javascript
* API v3
*/
@Injectable()
export class GoogleMapsAPIWrapper {
private _map: Promise<mapTypes.GoogleMap>;
private _mapResolver: (value?: mapTypes.GoogleMap) => void;
constructor(private _loader: MapsAPILoader, private _zone: NgZone) {
this._map =
new Promise<mapTypes.GoogleMap>((resolve: () => void) => { this._mapResolver = resolve; });
}
createMap(el: HTMLElement, mapOptions: mapTypes.MapOptions): Promise<void> {
return this._loader.load().then(() => {
const map = new google.maps.Map(el, mapOptions);
this._mapResolver(<mapTypes.GoogleMap>map);
return;
});
}
setMapOptions(options: mapTypes.MapOptions) {
this._map.then((m: mapTypes.GoogleMap) => { m.setOptions(options); });
}
}
@ArmenVardanyan 建议的解决方案
describe('Service: GoogleMapsAPIWrapper', () => {
const loaderServiceStub = {
load: () => Promise.resolve()
};
let service;
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
GoogleMapsAPIWrapper,
{provide: MapsAPILoader, useValue: loaderServiceStub}
]
});
}));
beforeEach(async(inject([GoogleMapsAPIWrapper], (_service: GoogleMapsAPIWrapper) => {
service = _service;
})));
it('should be created',() => {
expect(service).toBeTruthy();
});
it('should be call _mapResolver with specified arguments', async(() => {
const elem = document.createElement('div');
const spyOnCreateMap = spyOn(service, '_mapResolver');
service.createMap(elem, {})
.then(() => {
expect(spyOnCreateMap).toHaveBeenCalled();
expect(spyOnCreateMap).toHaveBeenCalledWith(new google.maps.Map(elem, {}));
});
}));
});
【问题讨论】:
-
您到底想测试什么? Google Maps API 真的有效吗?或者如果方法真的返回 Promises?
-
@ArmenVardanyan 感谢您的回复。对于 createMap() 方法,我想检查是否使用正确的参数调用了 this._mapResolver。对于 setMapOptions() 方法,我想检查是否使用(选项)调用了 m.setOptions。我已经检查过 google maps api 实际上在其他文件中工作。
-
好的,我会尽量提供答案
标签: javascript angular unit-testing jasmine