Unit-Test Klickereignis in Angular
Ich versuche zum hinzufügen von unit-tests, um meine Winkel 2 app. In einer meiner Komponenten gibt es eine Schaltfläche mit einem (click)
handler. Wenn der Benutzer auf die Schaltfläche klickt, wird eine Funktion aufgerufen, die definiert ist, in der .ts
class-Datei. Diese Funktion druckt eine Meldung in der Konsole.log-Fenster mit der Meldung, dass die Taste gedrückt wurde. Meine aktuelle Test-code-tests für den Druck der console.log
Nachricht:
describe('Component: ComponentToBeTested', () => {
var component: ComponentToBeTested;
beforeEach(() => {
component = new ComponentToBeTested();
spyOn(console, 'log');
});
it('should call onEditButtonClick() and print console.log', () => {
component.onEditButtonClick();
expect(console.log).toHaveBeenCalledWith('Edit button has been clicked!);
});
});
Ist dies jedoch nur tests der controller-Klasse, nicht das HTML. Ich will nicht nur testen, ob die Protokollierung geschieht, wenn onEditButtonClick
genannt wird; ich will auch testen, dass onEditButtonClick
wird aufgerufen, wenn der Benutzer auf die Schaltfläche Bearbeiten in der Komponente definiert die HTML-Datei. Wie kann ich das tun?
InformationsquelleAutor der Frage Aiguo | 2016-10-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zuerst den test mit dem Kantigen
TestBed
. Auf diese Weise können Sie tatsächlich greifen die Schaltfläche und klicken Sie darauf. Was Sie tun müssen ist, konfigurieren Sie ein Modul, wie würden Sie eine@NgModule
nur für die TestumgebungDann müssen Sie Spion auf die
onEditButtonClick
- Methode, klicken Sie auf die Schaltfläche, und überprüfen Sie, dass die Methode aufgerufen wurdeHier müssen wir laufen ein
async
test klicken Sie auf die Schaltfläche enthält eine asynchrone Ereignisbehandlung und müssen warten, bis die Ereignis-Prozess durch den Aufruffixture.whenStable
Siehe Auch:
InformationsquelleAutor der Antwort Paul Samsotha
Ereignisse getestet werden können mit der
async
/fakeAsync
Funktionen'@angular/core/testing'
da jedes Ereignis im browser asynchron ist und betätigt wird, um die Ereignis-Schleife/Warteschlange.Unten ist ein sehr einfaches Beispiel zum testen der click-Ereignis mithilfe von
fakeAsync
.Den
fakeAsync
Funktion ermöglicht eine lineare Codierung Stil durch ausführen der test-Körper in einer speziellenfakeAsync
test-zone.Hier bin ich-Tests eine Methode, die aufgerufen wird, indem Sie das click-Ereignis.
Unten ist das, was Winkel-docs zu sagen haben:
InformationsquelleAutor der Antwort Mav55
Ich hatte ein ähnliches problem (ausführliche Erklärung weiter unten), und ich löste es (in
jasmine-core: 2.52
) durch die Verwendung dertick
Funktion mit dem gleichen (oder höheren) Betrag von Millisekunden wie im originalsetTimeout
nennen.Zum Beispiel, wenn ich ein
setTimeout(() => {...}, 2500);
(so wird es auslösen nach 2500 ms), würde ichtick(2500)
und das würde das problem lösen.Was hatte ich in meiner Komponente, als Reaktion auf eine Löschen - Schaltfläche klicken Sie auf:
Ihr ist mein arbeiten test:
P. S. Tolle Erklärung auf
fakeAsync
und Allgemeine asyncs im Test kann hier gefunden werden: ein video-on-Test-Strategien mit den Eckigen 2 - Julie Ralph, ab 8:10, von 4 Minuten 🙂InformationsquelleAutor der Antwort Casper
Ich bin mit Winkel 6. Ich folgte Mav55 s Antwort und es hat funktioniert. Aber ich wollte sicherstellen, dass, wenn
fixture.detectChanges();
wirklich notwendig war, so habe ich es entfernt und es noch funktionierte. Dann entfernte ichtick();
um zu sehen, ob es geklappt hat und es auch Tat. Schließlich habe ich entfernt den test aus derfakeAsync()
wickeln, und überraschung, es funktionierte.So landete ich mit diesem:
Und es hat Prima funktioniert.
InformationsquelleAutor der Antwort Parziphal