Services und Abhängigkeiten mocken
Test-Doubles über DI bereitstellen
Services und Abhängigkeiten mocken ist eine kostenlose Angular Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Angular Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Angular Academy-Kurs umfasst insgesamt 4 Lektionen.
Warum Abhängigkeiten gemockt werden
Ein Komponententest sollte die Komponente isolieren. Wenn sie einen auf HttpClient basierenden Service injiziert, möchten Sie keine echten Netzwerkanfragen ausführen. Stellen Sie stattdessen ein Test-Double bereit: ein Fake-Objekt, das kontrollierte Daten zurückgibt, damit Tests schnell und deterministisch sind.
Ein Fake über useValue bereitstellen
Das einfachste Double ist ein gewöhnliches Objekt, das mit useValue bereitgestellt wird. Stellen Sie es unter demselben Injection-Token bereit, den die Komponente anfordert.
const fakeApi = { getUser: () => of({ name: 'Ada' }) };
TestBed.configureTestingModule({
imports: [ProfileComponent],
providers: [{ provide: UserApi, useValue: fakeApi }],
});Jasmine-Spies
jasmine.createSpyObj erstellt ein Fake-Objekt mit Spy-Methoden, sodass Sie sowohl Rückgabewerte vorgeben als auch Aufrufe überprüfen können.
const apiSpy = jasmine.createSpyObj<UserApi>('UserApi', ['getUser']);
apiSpy.getUser.and.returnValue(of({ name: 'Ada' }));
TestBed.configureTestingModule({
providers: [{ provide: UserApi, useValue: apiSpy }],
});Überprüfen, dass der Service aufgerufen wurde
Überprüfen Sie nach einer Aktion auf der Komponente, ob der Spy die erwarteten Argumente erhalten hat.
fixture.componentInstance.load(7);
fixture.detectChanges();
expect(apiSpy.getUser).toHaveBeenCalledWith(7);
expect(apiSpy.getUser).toHaveBeenCalledTimes(1);Observables aus Mocks zurückgeben
Services geben häufig Observables zurück. Verwenden Sie RxJS of() für synchrone Erfolge und throwError() für Fehler, damit Sie beide Pfade testen können.
import { of, throwError } from 'rxjs';
apiSpy.getUser.and.returnValue(of({ name: 'Ada' })); // success
apiSpy.getUser.and.returnValue(throwError(() => new Error('boom'))); // erroruseClass für wiederverwendbare Fakes
Wenn ein Fake in vielen Specs wiederverwendet wird, definieren Sie eine Klasse und binden Sie sie mit useClass ein.
class FakeUserApi {
getUser() { return of({ name: 'Test' }); }
}
TestBed.configureTestingModule({
providers: [{ provide: UserApi, useClass: FakeUserApi }],
});HttpClient mit HttpTestingController mocken
Um Services zu testen, die HTTP-Aufrufe ausführen, ohne den gesamten Service zu simulieren, importieren Sie provideHttpClientTesting() und leeren Sie Anfragen über HttpTestingController.
import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing';
TestBed.configureTestingModule({
providers: [provideHttpClient(), provideHttpClientTesting()],
});Eine HTTP-Anfrage leeren
Erwarten Sie eine Anfrage, antworten Sie darauf mit Testdaten und überprüfen Sie anschließend, dass keine unerwarteten Aufrufe übrig sind.
const http = TestBed.inject(HttpTestingController);
service.load();
const req = http.expectOne('/api/users/7');
expect(req.request.method).toBe('GET');
req.flush({ name: 'Ada' });
http.verify();Einen Provider pro Spec überschreiben
Manchmal benötigt ein einzelner Test ein anderes Test-Double. Verwenden Sie TestBed.overrideProvider() vor createComponent.
TestBed.overrideProvider(UserApi, {
useValue: { getUser: () => throwError(() => new Error('fail')) },
});
const fixture = TestBed.createComponent(ProfileComponent);Nur das Nötigste simulieren
Ein gutes Test-Double implementiert nur die Methoden, die die Komponente tatsächlich verwendet. Übermäßiges Mocking koppelt Ihren Test an interne Details; zu wenig Mocking lässt echte Seiteneffekte durch. Orientieren Sie sich am öffentlichen Vertrag, von dem die Komponente abhängt.
Echte Service-Methoden überwachen
Sie können auch einen echten Service beibehalten, aber mit spyOn(instance, 'method') eine einzelne Methode überwachen. Das ist nützlich, wenn der größte Teil des Services unproblematisch ist, aber ein Aufruf abgefangen werden muss.
const svc = TestBed.inject(AnalyticsService);
spyOn(svc, 'track');
fixture.componentInstance.onClick();
expect(svc.track).toHaveBeenCalledWith('click');Kurze Überprüfung
Wie erstellen Sie ein Test-Double, das Aufrufe überprüfen UND Rückgabewerte steuern kann?
Zusammenfassung
Sie haben echte Abhängigkeiten mithilfe von useValue, useClass und Jasmine-Spies durch Test-Doubles ersetzt, Observables mit of/throwError zurückgegeben, HTTP über HttpTestingController getestet und Provider pro Spec überschrieben. Simulieren Sie nur den Vertrag, den die Komponente verwendet.
Häufig gestellte Fragen
Ist die Lektion „Services und Abhängigkeiten mocken“ kostenlos?
Ja — der vollständige Text von „Services und Abhängigkeiten mocken“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Angular Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Angular Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Services und Abhängigkeiten mocken“?
Test-Doubles über DI bereitstellen Du übst Angular Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Angular Academy zu starten?
Keine Vorkenntnisse erforderlich. Angular Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „Services und Abhängigkeiten mocken“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Angular Academy-Lektion Code schreiben und ausführen?
Ja. Jede Angular Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- TestBed und Component Fixtures
- Inputs, Outputs und DOM testen
- Services und Abhängigkeiten mocken
- Signals und asynchronen Code testen