Angular Academy · leksjon

Mocking av tjenester og avhengigheter

Tilby testdobler via DI.

Leksjon 3 av 413 trinn

Mocking av tjenester og avhengigheter er en gratis leksjon i Angular Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Angular Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Angular Academy inneholder totalt 4 leksjoner.

Hvorfor mocke avhengigheter

En komponenttest bør isolere komponenten. Hvis den injiserer en tjeneste som bruker HttpClient, ønsker De ikke ekte nettverkskall. Gi i stedet en testdouble: et falskt objekt som returnerer kontrollerte data, slik at testene blir raske og deterministiske.

Gi en falsk implementasjon via useValue

Den enkleste testdoblen er et vanlig objekt som angis med useValue. Angi det under det samme injeksjonstokenet som komponenten ber om.

const fakeApi = { getUser: () => of({ name: 'Ada' }) };
TestBed.configureTestingModule({
  imports: [ProfileComponent],
  providers: [{ provide: UserApi, useValue: fakeApi }],
});

Jasmine-spioner

jasmine.createSpyObj bygger en falsk implementasjon med spionmetoder, slik at De både kan angi returverdier og kontrollere kall.

const apiSpy = jasmine.createSpyObj<UserApi>('UserApi', ['getUser']);
apiSpy.getUser.and.returnValue(of({ name: 'Ada' }));
TestBed.configureTestingModule({
  providers: [{ provide: UserApi, useValue: apiSpy }],
});

Bekrefte at tjenesten ble kalt

Etter at De har utført en handling på komponenten, kontrollerer De at spionen mottok de forventede argumentene.

fixture.componentInstance.load(7);
fixture.detectChanges();
expect(apiSpy.getUser).toHaveBeenCalledWith(7);
expect(apiSpy.getUser).toHaveBeenCalledTimes(1);

Returnere Observables fra testerstatninger

Tjenester returnerer ofte Observables. Bruk RxJS of() for synlig suksess og throwError() for feil, slik at De kan teste begge grenene.

import { of, throwError } from 'rxjs';

apiSpy.getUser.and.returnValue(of({ name: 'Ada' }));     // success
apiSpy.getUser.and.returnValue(throwError(() => new Error('boom'))); // error

useClass for gjenbrukbare testerstatninger

Når en testdouble skal brukes på tvers av mange tester, definerer De en klasse og kobler den til med useClass.

class FakeUserApi {
  getUser() { return of({ name: 'Test' }); }
}
TestBed.configureTestingModule({
  providers: [{ provide: UserApi, useClass: FakeUserApi }],
});

Mocke HttpClient med HttpTestingController

For å teste tjenester som foretar HTTP-kall uten å simulere hele tjenesten, importerer du provideHttpClientTesting() og tømmer forespørsler via HttpTestingController.

import { provideHttpClient } from '@angular/common/http';
import { provideHttpClientTesting, HttpTestingController } from '@angular/common/http/testing';

TestBed.configureTestingModule({
  providers: [provideHttpClient(), provideHttpClientTesting()],
});

Tømme en HTTP-forespørsel

Forvent en forespørsel, svar på den med testdata, og kontroller deretter at det ikke gjenstår uventede kall.

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();

Overstyre en provider per spesifikasjon

Noen ganger trenger én test en annen testdobbel. Bruk TestBed.overrideProvider() før createComponent.

TestBed.overrideProvider(UserApi, {
  useValue: { getUser: () => throwError(() => new Error('fail')) },
});
const fixture = TestBed.createComponent(ProfileComponent);

Simuler bare det som er nødvendig

En god testdobbel implementerer bare metodene komponenten faktisk bruker. For mye mocking kobler testen til interne detaljer, mens for lite mocking lar reelle bivirkninger lekke ut. Tilpass den offentlige kontrakten komponenten er avhengig av.

Spioner på metoder i reelle tjenester

Du kan også beholde en reell tjeneste, men spionere på én metode ved hjelp av spyOn(instance, 'method'). Dette er nyttig når det meste av tjenesten er ufarlig, men ett kall må fanges opp.

const svc = TestBed.inject(AnalyticsService);
spyOn(svc, 'track');
fixture.componentInstance.onClick();
expect(svc.track).toHaveBeenCalledWith('click');

Hurtigsjekk

Hvordan får du en testdobbel til å kontrollere kall OG styre returverdier?

Oppsummering

Du erstattet reelle avhengigheter med testdobler ved hjelp av useValue, useClass og Jasmine-spioner, returnerte Observables med of/throwError, testet HTTP via HttpTestingController og overstyrte providers per spesifikasjon. Mock bare kontrakten komponenten bruker.

Gratis å komme i gang

Lær deg HTML med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
38
Leksjoner
144

Ofte stilte spørsmål

Er leksjonen «Mocking av tjenester og avhengigheter» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Angular Academy, inkludert «Mocking av tjenester og avhengigheter», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Angular Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Mocking av tjenester og avhengigheter»?

Tilby testdobler via DI. Du øver på Angular Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Angular Academy?

Ingen tidligere erfaring er nødvendig. Angular Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Mocking av tjenester og avhengigheter»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Angular Academy-leksjonen?

Ja. Alle Angular Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. TestBed og komponent-fixtures
  2. Teste inndata, utdata og DOM
  3. Mocking av tjenester og avhengigheter
  4. Teste signaler og asynkron kode
← Tilbake til Angular Academy