Die Komponente CustomerTable.vue
initialisiert noch
die customers
in der Tabelle hardcoded im script
.
Wir wollen aber diese Daten aus dem Backend abfragen.
Wir haben bereits eine httpRequest
Funktion implementiert, die
asynchrone HTTP Anfragen macht.
In httpRequest.spec.ts
wird sie getestet.
Die Tests verwenden ein backendMock
, was konfiguriert werden kann, um
gewisse Netzwerkanfragen zu erwarten und darauf zu antworten (API
siehe HTTPMockConfig
).
Wie immer entwickeln wir testgetrieben.
- Nutzt
httpRequest
inCustomerPage.vue
, um die Customer asynchron zu laden (die bisherigen hardcoded Testdaten sollen gelöscht werden). - Nutzt
httpRequest
, um neue Customer anzulegen.
Denkt dran, dass keine unresolved Promise hängenbleiben darf (das würde die folgenden Tests beeinflussen)!
Die Customer direkt in der CustomerPage.vue
zu verwalten und
abzufragen ist unpraktisch.
Die Seite muss sich sowohl um Datenabfragen und -verwaltung als auch um die Anzeige kümmern.
Dadurch werden die Tests schnell unübersichtlich und können aus vielen unterschiedlichen Gründen scheitern.
Wir schlagen daher vor, die Datenverwaltung auszulagern.
Das Interface CustomerRepository
definiert eine Struktur, die
man für die Datenverwaltung verwenden kann.
- Entwickelt testgetrieben ein
CustomerRepositoryImpl
, dasCustomerRepository
implementiert. Ihr könnt Teile von der Tests der Page wiederverwenden. - Nutzt den Provide/Inject Mechanismus von Vue, um die
Repository per Dependency Injection in der
CustomerPage.vue
zu bekommen. Achtet darauf, dass die Tests noch laufen!- Statt direkt
inject
in der Page aufzurufen, könnt ihrinjectOrThrow
verwenden. Diese Funktion verwendet die typsichere Art, in Vue dependencies abzufragen und stellt gleichzeitig sicher, dass die Dependency nichtnull
ist (ansonsten wird ein Fehler geworfen). - Der Provide kann global in der
main.ts
erfolgen.
- Statt direkt
- Nutzt jetzt das Repository in der
CustomerPage.vue
, um die direkte Abhängigkeit zum Netzwerk abzulösen. - Implementiert einen
CustomerRepositoryMock
. Das ist eine stark vereinfachte Version vonCustomerRepository
(ohne Netzwerk-Interaktion), die anschließend in den Tests verwendet werden kann, um nicht mehr die Netzwerkaufrufe abfangen zu müssen.
- Implementiert das Löschen von Kontakten.
- Achtet darauf, dass die Daten konsistent bleiben, auch wenn mehrere Kontakte gleichzeitig gelöscht werden!
- Implementiert eine Fehlerhandlung, die eine Nachricht anzeigt, wenn eine Backend-Request nicht erfolgreich war. Wie kann man das sinnvoll testen?
- Leere Tabellen, die sich ur-plötzlich mit Daten füllen, sind überraschend für Nutzer.
Integriert den Lade-Indikator, um anzuzeigen, dass gerade noch etwas nachgeladen wird.
Das wird in Zukunft deutlich einfacher sein, wenn
top-level await
undSuspense
in Vue 3 stabil verfügbar sind. Aktuell ist es leider nur experimentell und@testing-library/vue
unterstützt es nicht, daher empfehlen wir vorerst ein simples boolean-Flag zu verwenden.
Die folgende Backend-Endpunkte sind verfügbar:
GET /api/
gibt alle Customer zurückPOST /api/
erstellt einen neuen Customer. Erwartet als POST-body einenCustomerUnsaved
(d.h.Customer
ohneid
undstatus
)DELETE /api/:id
löscht einen Customer
Um asynchronen Operationen die Chance geben zu können, weiterzulaufen,
ist flushPromises
hilfreich.