Verwenden von @Input() zum Testen von Komponenten in Angular

Blog

Verwenden von @Input() zum Testen von Komponenten in Angular

Wenn Sie eine Angular-Komponente entwickeln, die eine Eingabe akzeptiert, können Sie sich für einen Komponententest der gesamten Komponente entscheiden. Das hoffe ich zumindest!



Wir haben zum Beispiel eine Komponente, |_+_|, in der wir Eingaben in Upcases anzeigen möchten… Ich weiß richtig: Was für ein großartiger Anwendungsfall, das braucht jeder Geschäftsinhaber!

Sagen wir also das |_+_| bindet und zeigt Eingaben an.



ComponentUnderTest

Um zu überprüfen, dass |_+_| unsere Eingabe korrekt hochschreibt, können wir der Eingabevariablen einfach einen Testwert zuweisen und behaupten, dass die angezeigte Eingabe nach dem Aufrufen der Methode GANZ GROSSBUCHSTABEN ist.

ComponentUnderTest

Kinderleicht! Rechts?



Aber jetzt müssen wir |_+_| . manuell aufrufen und bis wir es aufrufen, wird unsere Eingabe immer noch in miesen Kleinbuchstaben angezeigt.

Zum Glück mit Angulars |_+_| Lifecycle-Hook, können wir unseren |_+_| . auslösen noch bevor etwas angezeigt wird. Also implementieren wir es und rufen |_+_| in der entsprechenden Methode.

@Component({ selector: 'component-under-test', template: ' {{ input }} ' }) export class ComponentUnderTestComponent{ @Input() input; processInput(): void { this.input = this.input.toUpperCase(); } }

Lassen Sie uns die Tests durchführen!

Ach nein! Die Tests scheitern!

processInput()

Ah, natürlich, bis |_+_| wird bei der Eingabe in unserem |_+_| . aufgerufen wir haben ihm noch nicht einmal einen Wert beigemessen.

Wenn wir unsere Komponente tatsächlich in den Produktionscode einbetten, hätten wir den Wert von |_+_| indem Sie die Eingabe im Tag der Komponente binden.

sqlite zu mysql konvertieren
it('should show TEST INPUT', () => { component.input = 'test input'; component.processInput(); fixture.detectChanges(); expect(fixture.nativeElement.querySelector('div').innerText).toEqual('TEST INPUT'); });

Also lass uns das |_+_| . einbetten in einem |_+_|. Indem wir tatsächlich eine Host- oder Elternkomponente haben, können wir genau die Eingaben übergeben, die wir für unseren Test benötigen.

In unserem Test können wir dieses |_+_| einfach definieren, in die Testmodulkonfiguration aufnehmen und in unserem |_+_| . instanziieren Methode.

processInput()

Was Ergebnisse sind, sind grüne Tests und die Eingabe wird zu Beginn hochgeschrieben.

Können wir jedoch wirklich sicher sein, dass die Eingabe groß geschrieben wird und unsere Komponente nicht immer INPUT TEXT anzeigt? Lassen Sie uns einen weiteren Test schreiben, der verschiedene Testeingaben hochschreibt.

Um dies zu erreichen, könnten wir ein weiteres |_+_| . definieren das bindet einen anderen Eingang, aber wir können es besser machen!

OnInit

|_+_| setzt die Eingabe in unserer Hostkomponente. Wenn Sie die Eingabe in unserem Test zuweisen, bevor wir Angular die Änderungen erkennen lassen, können unsere beiden Tests bestehen…

Stellen Sie sich nun vor, wir müssen nicht nur eine, sondern mehrere Eingaben an unsere Komponente binden. Müssen wir jetzt für jede Eingabe eine Setter-Methode schreiben?

Zum Glück lautet die Antwort nein!

processInput()

Anstatt überhaupt einen Setter zu haben, können wir auch einen Verweis auf unsere Komponente aus der Hostkomponente abrufen und an unseren Test übergeben. Dort haben wir die volle Kontrolle über unsere Komponente und können jedes beliebige Feld ändern.

Zusammenfassung

  • Um Komponenten zu testen, die eine Eingabe über das |_+_| . binden decorator können wir in unserem Test eine Hostkomponente erstellen, um unsere Testkomponente zu umschließen.
  • Für mehrere Testeingaben können wir unserer Hostkomponente einen Setter hinzufügen.
  • Für mehr als eine Eingabebindung und noch mehr Kontrolle über unsere zu testende Komponente können wir sie aus der Hostkomponente mit |_+_| . abrufen und geben es direkt in unseren Test ein.

Vielen Dank fürs Lesen!

Zaubersprüche für den Sieg vor Gericht

#angular #javascript #Frontend-Entwicklung