Winkel-2+: Prüfung form mit matt-Folie-toggle - change-Ereignis wird nicht ausgelöst
Ich bin nicht sicher, warum die das change-Ereignis nicht auslösen und daher nicht auslösen die Funktion habe ich registriert für das change-Ereignis.
Ich weiß, das funktioniert, wenn ich es ausführen, aber ich kann es nicht in der spec.
Hier ist eine demo von was ich spreche... Wie Sie sehen können aus den Protokollen, die toggle
nie aufgerufen wird:
https://stackblitz.com/edit/angular-material-slide-toggle-test-utmbmy?file=app%2Fhello.component.spec.ts
Rund, das ist mein code hier...
component.html:
<mat-slide-toggle [checked]="useDefault" (change)="toggle($event)"></mat-slide-toggle>
Komponente.ts:
...
toggle(event: MatSlideToggleChange) {
console.log('Toggle fired');
this.useDefault = event.checked;
}
In meinem spec.ts:
it('should trigger toggle...', () => {
const componentDebug = fixture.debugElement;
const slider: MatSlideToggle =
componentDebug.query(By.css('form mat-slide-toggle')).componentInstance;
console.log('before ' + slider.checked);
slider.toggle();
fixture.detectChanges();
console.log('after ' + slider.checked);
console.log('useDefault ' + component.useDefault);
});
Den after
Protokollierung nicht drucken slider.checked
zu den entgegengesetzten Wert von before
. Jedoch, die component.useDefault
bleibt die gleiche, und die logging-Anweisung in der toggle
Funktion nie aufgerufen wird, was bedeutet, dass es nie Eintritt.
Warum ist das passiert und wie kann ich dieses Problem beheben?
Habe ich habe versucht, indem Sie die ganze Sache in fakeAsync
mit tick
können, indem die 'nach' - code in fixture.whenStable()
und fixture.whenRenderingDone()
.
Ich habe eine NoopAnimationsModule
im TestBed
's import
.
- Was ist die
useDefault
? Ist etwas aus dermat-slide-toggle
? Ist eine Richtlinie, die Sie erstellt haben? - stackblitz.com/edit/angular-material-slide-toggle-test?file=app/...
- Ok, ich aktualisiert meine Frage code.
useDefault
war nur ein Tippfehler, es sollte[checked]="useDefault"
. Allerdings habe ich modifizierte Komponente ein bisschen mehr im Einklang mit dem, was ich habe, also, beginnen mituseDefault = true
. Ich habe nur Hinzugefügt, einige logging-Anweisungen. Nun, aus Gründen, die ich nicht verstehen kann, dietoggle
log nicht angezeigt, bis nicht mehr:stackblitz.com/edit/... - Versuchen Sie auslösen des change-Ereignisses direkt:
componentDebug.query(By.css('mat-slide-toggle')).nativeElement.dispatchEvent(new Event('change'));
werden Sie wahrscheinlich haben, zu verhöhnen, die MatSlideToggleChange Objekt somhow als gut.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bei der Verwendung von Drittanbieter-Komponenten, sollte man zutrauen, dass Sie das Ereignis behandeln. Allerdings könnte man das Ereignis auszulösen, mit dem triggereventhandler, während Sie spyOn die Methode, die Sie wollen, aufgerufen werden.
Komponente
Test
Finden Sie in der test-Weitergabe stackblitz: https://stackblitz.com/edit/angular-material-slide-toggle-test-spy-trigger-event?file=app/hello.component.spec.ts
(change)="onToggle()"
. Die tests werden immer noch passieren, weil ich die PrüfungonToggle
direkt, aber die app wird nicht funktionieren, weil die Veranstaltung verbindlich ist, fehlt jetzt. Ich poste meine Lösung bald...const slider: HtmlElement = componentDebug.query(By.css('form mat-slide-toggle input')).nativeElement;
tun, und dannslider.click()
. Das macht eigentlich dieMatSlideToggle
emittieren diechange
Veranstaltung. Ich glaube tatsächlich, es ist ein Fehler inMatSlideToggle
Komponente. Seinetoggle()
Funktion kippt diethis.checked = !this.checked
aber NICHT emittieren ein change-Ereignis. Ich denke, dass ist ein bug. Es sein sollte.(change)="onToggle()"
Ihr test fehl schlägt. (siehe stackblitz.com/edit/...). IMO, sollten Sie einen unit-test für den Logik-innen wechseln und ein anderes zu nennen, auf das Ereignis zu ändern (wie im Beispiel)mat-slide-toggle input
als Selektor. Alles funktioniert einwandfrei, wenngleich ich denke, Umschalten sollte emittieren das change-Ereignis und diese "Art " hack" wäre nicht erforderlich. stackblitz.com/edit/...