Итак, я работал над модульным тестированием для моего приложения Angular. Я использую Angular Material, и у меня есть компонент, который использует drag-drop CDK cdk drag-drop API .
HTML-код выглядит следующим образом
<mat-card class="interventionCard">
<div cdkDropListGroup class="container">
<div cdkDropList
[cdkDropListData]="interventionsTodo" (cdkDropListDropped)="drop($event)" class="dragContainer">
<div class="dragInter" *ngFor="let i of interventionsTodo" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
<a class="resetInv" (click)="reset()"><div class="dragInter"><img src="../assets/images/simulation-intervention/noIntervention.svg" class="interventionIc" alt=""></div></a><!---->
</div>
<div class="dropContainer">
<div cdkDropList [cdkDropListData]="interventionsDoneNow" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDoneNow" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
</div>
<div class="connectorL"></div>
<div cdkDropList [cdkDropListData]="interventionsDonePlus5" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDonePlus5" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc"></div>
</div>
<div class="connectorL"></div>
<div cdkDropList [cdkDropListData]="interventionsDonePlus10" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDonePlus10" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
</div>
<div class="connectorL"></div>
<div cdkDropList [cdkDropListData]="interventionsDonePlus15" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDonePlus15" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
</div>
<div class="connectorL"></div>
<div cdkDropList [cdkDropListData]="interventionsDonePlus20" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDonePlus20" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
</div>
<div class="connectorL"></div>
<div cdkDropList [cdkDropListData]="interventionsDonePlus25" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDonePlus25" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
</div>
<div class="connectorL"></div>
<div cdkDropList [cdkDropListData]="interventionsDonePlus30" (cdkDropListDropped)="drop($event)" class="dropZone">
<div class="dragInterDropped" *ngFor="let i of interventionsDonePlus30" cdkDrag><img src="{{i.imgSrc}}" class="interventionIc" alt=""></div>
</div>
</div>
Все хорошо, теперь у меня есть событие cdkDropListDroppet, которое вызывает функцию drop()
drop(event: CdkDragDrop<{ imgSrc: string }[], any>) {
if (event.previousContainer === event.container) {
moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);
} else {
if(event.container.data === this.interventionsTodo){
this.deleteSpecificItemFromTimeline(event.previousContainer.data[0]);
}else if(event.container.data.length <1){
copyArrayItem(event.previousContainer.data,
event.container.data,
event.previousIndex,
event.currentIndex);
}
}
}
это работает отлично, теперь я провожу юнит-тестирование углового приложения (жасмин / карма)
и я пытаюсь отправить событие CdkDragDrop, чтобы я мог проверить функциональность моей функции drop()
.
Итак, в угловой документации есть небольшая глава о тестировании DOM компонентов, где упоминается, что вы должны получить htmlElement, где вы хотите запустить событие, которое я делаю так: angular docs
let Dbg = fixture.debugElement;
let htE = Dbg.nativeElement.querySelector(".dragContainer");
теперь у меня есть элемент, для которого я хочу запустить событие, поэтому полный код выглядит следующим образом
let Dbg = fixture.debugElement;
let htE = Dbg.nativeElement.querySelector(".dragContainer");
htE.addEventListener('CdkDragDrop', (ev:any) => {
component.drop(ev);
});
let bla = htE.dispatchEvent(new Event('cdkDropListDropped'));
Итак, bla возвращает true, что (если я не ошибаюсь) означает, что событие было запущено, но, похоже, ничего не произошло
fixture.detectchanges()
происходит автоматически ..
я попытался отладить его, чтобы увидеть, что происходит, но функция прослушивателя никогда не запускается, и я искал повсюду, чтобы найти ответ, но, похоже, ничего не могу найти в такого рода тестировании событий ..