Swift Academy · leksjon

Teste view models

Enhetstest presentasjonslogikk isolert.

Leksjon 4 av 413 trinn

Teste view models er en gratis leksjon i Swift Academy på CoddyKit. Dette er leksjon 4 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 Swift Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Swift Academy inneholder totalt 4 leksjoner.

Hvorfor teste ViewModel-er?

ViewModel inneholder presentasjonslogikken din, og er derfor det mest verdifulle laget å enhetsteste. Siden det ikke er avhengig av UIKit eller SwiftUI, kan du teste det isolert, raskt og deterministisk.

Testbar fra starten av

En godt utformet ViewModel mottar avhengighetene sine gjennom initialisereren. Dermed kan tester erstatte dem med falske implementasjoner.

final class WeatherViewModel: ObservableObject {
    @Published var temperatureText = ""
    private let service: WeatherService

    init(service: WeatherService) {
        self.service = service
    }
}

Avhengighetsinjeksjon

Skjul konkrete avhengigheter bak en protokoll. ViewModel-en avhenger av abstraksjonen, slik at tester kan injisere en mock.

protocol WeatherService {
    func fetchTemperature() async throws -> Double
}

Skrive en mock

En mock samsvarer med protokollen og returnerer forhåndsdefinerte data. Den lar deg kontrollere nøyaktig hva ViewModel-en ser.

final class MockWeatherService: WeatherService {
    var stubbedTemperature: Double = 20
    var didCallFetch = false

    func fetchTemperature() async throws -> Double {
        didCallFetch = true
        return stubbedTemperature
    }
}

En grunnleggende enhetstest

Med mock-en injisert kan du kontrollere at ViewModel-en transformerer dataene riktig.

func testFormatsTemperature() async {
    let mock = MockWeatherService()
    mock.stubbedTemperature = 25
    let vm = WeatherViewModel(service: mock)

    await vm.load()

    XCTAssertEqual(vm.temperatureText, "25 C")
}

Teste tilstandsoverganger

ViewModel-er eksponerer ofte en enum for tilstanden. Test hver gren ved å sende inn inndataene som utløser den.

func testLoadingThenLoaded() async {
    let vm = FeedViewModel(service: MockFeedService())
    XCTAssertEqual(vm.state, .loading)

    await vm.load()

    XCTAssertEqual(vm.state, .loaded(["A", "B"]))
}

Teste feilstier

La mock-en kaste en feil for å kontrollere at ViewModel-en håndterer feil på en god måte og eksponerer en feiltilstand.

final class FailingService: WeatherService {
    func fetchTemperature() async throws -> Double {
        throw URLError(.notConnectedToInternet)
    }
}

func testShowsErrorOnFailure() async {
    let vm = WeatherViewModel(service: FailingService())
    await vm.load()
    XCTAssertEqual(vm.state, .error)
}

Kontrollere samhandlinger

Noen ganger er det viktig at en avhengighet ble kalt, ikke bare hvilket resultat den ga. Flagg på mock-en som registrerer kall, lar deg kontrollere atferden.

func testFetchIsCalled() async {
    let mock = MockWeatherService()
    let vm = WeatherViewModel(service: mock)
    await vm.load()
    XCTAssertTrue(mock.didCallFetch)
}

Teste @Published-utdata

Du kan abonnere på en @Published-egenskap med Combine for å fange opp verdiene som sendes ut, og kontrollere sekvensen.

var received: [String] = []
let cancellable = vm.$temperatureText.sink { received.append($0) }

await vm.load()

XCTAssertEqual(received.last, "25 C")
cancellable.cancel()

Holde testene raske

Fordi mock-er returnerer umiddelbart og det ikke finnes noe ekte nettverk, kjører ViewModel-testene på millisekunder. Unngå ekte tidtakere og URLSession – injiser også falske implementasjoner for klokker og planleggere.

Beste praksis

Effektive ViewModel-tester:

  • Injiser alle avhengigheter via protokoller
  • Test én atferd per testmetode
  • Dekk suksess-, tomme- og feiltilstander
  • Kontroller publiserte utdata som visningen ville lest

Kort test

Test kunnskapen din om testing av ViewModel-er.

Oppsummering

Du har lært å enhetsteste ViewModel-er isolert:

  • Injiser avhengigheter bak protokoller
  • Bruk mock-er til å kontrollere inndata og registrere kall
  • Dekk suksess-, feil- og tomme tilstander
  • Kontroller @Published-utdata og tilstandsoverganger

Testbare ViewModel-er er gevinsten ved MVVMs separasjon av ansvar.

Gratis å komme i gang

Lær deg Swift 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
122
Leksjoner
409

Ofte stilte spørsmål

Er leksjonen «Teste view models» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Swift Academy, inkludert «Teste view models», 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 Swift Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Teste view models»?

Enhetstest presentasjonslogikk isolert. Du øver på Swift 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 Swift Academy?

Ingen tidligere erfaring er nødvendig. Swift 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 4 av 4.

Hvor lang tid tar leksjonen «Teste view models»?

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 Swift Academy-leksjonen?

Ja. Alle Swift 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. MVVM-mønsteret
  2. Knytte view models til visninger
  3. Coordinator-mønsteret
  4. Teste view models
← Tilbake til Swift Academy