#javascript #angular #karma-jasmine #istanbul
#javascript #угловой #карма-жасмин #istanbul
Вопрос:
Я использую тестирование jasmine.
И у меня есть эта функция:
style: string;
toggleStyle(style: string, version: string) {
this.style = `mapbox://styles/mapbox/${style}-${version}`;
}
и шаблон:
<div class="map-menu-item" (click)="toggleStyle('outdoors', 'v11')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faMountain" size="sm" class="pr-2"></fa-icon>Outdoors
</span>
</div>
Итак, у меня есть эта функция модульного тестирования:
fit('Should mapbox style when user click on icon', () => {
spyOn(component, 'toggleStyle').and.callThrough();
fixture.debugElement.query(By.css('.map-menu-item')).nativeElement.click();
fixture.detectChanges();
expect(component.toggleStyle).toHaveBeenCalled();
});
Поэтому я вызываю функцию: toggleStyle
Но я все еще получаю эту ошибку:
Expected spy toggleStyle to have been called.
Конечно, я погуглил об этой ошибке. Но я выполняю прохождение вызова и вызываю функцию.
Итак, что я должен изменить?
Спасибо
Я также использую this.style здесь:
async ngOnInit() {
this.style = `mapbox://styles/mapbox/light-v10`;
const earthquakes: GeoJSON.FeatureCollection = <any>await import('./amsterdam.geo.json');
this.earthquakes = {...earthquakes};
}
Здесь он используется:
<mgl-map [style]="style" [zoom]="[9]" [center]="[4.899, 52.372]">
<mgl-control position="top-left">
<div class="d-flex flex-column justify-content-start map-menu">
<span class="map-menu-header">Sensor</span>
<div class="map-menu-item" (click)="toggleLayer('amsterdam')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faVideo" size="sm" class="pr-2"></fa-icon>CityHeat
</span>
</div>
<div class="map-menu-item" (click)="toggleLayer('earthquakes')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faWifi" size="sm" class="pr-2"></fa-icon>Wi-Fi
</span>
</div>
</div>
<div class="d-flex flex-column justify-content-start map-menu">
<span class="map-menu-header">Layer</span>
<div class="map-menu-item" (click)="toggleStyle('light', 'v10')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faAdjust" size="sm" flip="horizontal" class="pr-2"></fa-icon>Light
</span>
</div>
<div class="map-menu-item" (click)="toggleStyle('outdoors', 'v11')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faMountain" size="sm" class="pr-2"></fa-icon>Outdoors
</span>
</div>
<div class="map-menu-item" (click)="toggleStyle('satellite', 'v9')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faSatellite" size="sm" class="pr-2"></fa-icon>Satellite
</span>
</div>
</div>
</mgl-control>
</mgl-map>
Комментарии:
1. Я бы вообще рекомендовал не шпионить за тем, что вы должны тестировать. Проверьте поведение — где
this.style
используется?2. Я обновил сообщение
3. Это похоже на то, где он установлен впервые. Где он используется — как бы вы сказали, что он был обновлен?
4. Привет, я добавил шаблон
Ответ №1:
Селектор выбирает первый элемент, которому он соответствует, поэтому ваш селектор соответствует этому элементу:
<div class="map-menu-item" (click)="toggleLayer('amsterdam')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faVideo" size="sm" class="pr-2"></fa-icon>CityHeat
</span>
</div>
где вызывается обработчик щелчка toggleLayer
.
Измените свой HTML на более конкретный:
<div class="d-flex flex-column justify-content-start map-menu somethingMoreSpecific">
<span class="map-menu-header">Layer</span>
<div class="map-menu-item" (click)="toggleStyle('light', 'v10')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faAdjust" size="sm" flip="horizontal" class="pr-2"></fa-icon>Light
</span>
</div>
<div class="map-menu-item" (click)="toggleStyle('outdoors', 'v11')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faMountain" size="sm" class="pr-2"></fa-icon>Outdoors
</span>
</div>
<div class="map-menu-item" (click)="toggleStyle('satellite', 'v9')" [state]="[true]" menuItemToggle>
<span>
<fa-icon [icon]="faSatellite" size="sm" class="pr-2"></fa-icon>Satellite
</span>
</div>
</div>
fit('Should mapbox style when user click on icon', () => {
spyOn(component, 'toggleStyle').and.callThrough();
fixture.debugElement.query(By.css('.somethingMoreSpecific .map-menu-item')).nativeElement.click(); // change the selector to select the correct div
fixture.detectChanges();
expect(component.toggleStyle).toHaveBeenCalled();
});