Testning af view models
Unit-test præsentationslogik isoleret.
Testning af view models er en gratis Swift Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Swift Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Swift Academy-kurset indeholder 4 lektioner i alt.
Hvorfor teste ViewModels?
ViewModel indeholder din præsentationslogik, hvilket gør den til det mest værdifulde lag at teste med enhedstests. Fordi den ikke afhænger af UIKit eller SwiftUI, kan du teste den isoleret, hurtigt og deterministisk.
Testbar fra starten
En velbygget ViewModel modtager sine afhængigheder gennem sin initialiserer. Det giver testene mulighed for at erstatte dem med fakes.
final class WeatherViewModel: ObservableObject {
@Published var temperatureText = ""
private let service: WeatherService
init(service: WeatherService) {
self.service = service
}
}Injektion af afhængigheder
Skjul konkrete afhængigheder bag en protokol. ViewModel'en afhænger af abstraktionen, så testene kan injicere en mock.
protocol WeatherService {
func fetchTemperature() async throws -> Double
}Skriv en mock
En mock implementerer protokollen og returnerer forudbestemte data. Den lader dig kontrollere præcis, hvad ViewModel'en ser.
final class MockWeatherService: WeatherService {
var stubbedTemperature: Double = 20
var didCallFetch = false
func fetchTemperature() async throws -> Double {
didCallFetch = true
return stubbedTemperature
}
}En grundlæggende enhedstest
Med mocken injiceret kan du kontrollere, at ViewModel'en omdanner data korrekt.
func testFormatsTemperature() async {
let mock = MockWeatherService()
mock.stubbedTemperature = 25
let vm = WeatherViewModel(service: mock)
await vm.load()
XCTAssertEqual(vm.temperatureText, "25 C")
}Test af tilstandsovergange
ViewModels eksponerer ofte en enum for tilstanden. Test hver gren ved at give de input, der frembringer den.
func testLoadingThenLoaded() async {
let vm = FeedViewModel(service: MockFeedService())
XCTAssertEqual(vm.state, .loading)
await vm.load()
XCTAssertEqual(vm.state, .loaded(["A", "B"]))
}Test af fejlruter
Få mocken til at kaste en fejl for at kontrollere, at ViewModel'en håndterer fejl på en god måde og viser en fejltilstand.
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)
}Kontrol af interaktioner
Nogle gange er det vigtigt, at en afhængighed blev kaldt, ikke kun hvilket resultat den gav. Flag i mocken, der registrerer kald, lader dig kontrollere adfærden.
func testFetchIsCalled() async {
let mock = MockWeatherService()
let vm = WeatherViewModel(service: mock)
await vm.load()
XCTAssertTrue(mock.didCallFetch)
}Test af @Published-uddata
Du kan abonnere på en @Published-egenskab med Combine for at opfange udsendte værdier og kontrollere rækkefølgen.
var received: [String] = []
let cancellable = vm.$temperatureText.sink { received.append($0) }
await vm.load()
XCTAssertEqual(received.last, "25 C")
cancellable.cancel()Hold testene hurtige
Fordi mocks returnerer øjeblikkeligt, og der ikke er noget rigtigt netværk, kører ViewModel-test på millisekunder. Undgå rigtige timere og URLSession – injicer også fakes for ure og planlæggere.
Bedste praksis
Effektive ViewModel-tests:
- Injicer alle afhængigheder via protokoller
- Test én adfærd pr. testmetode
- Dæk succes-, tomme og fejlforløb
- Kontrollér de publicerede uddata, som visningen ville læse
Hurtigt tjek
Test din viden om test af ViewModels.
Opsummering
Du har lært at teste ViewModels med enhedstests isoleret:
- Injicer afhængigheder bag protokoller
- Brug mocks til at kontrollere input og registrere kald
- Dæk succes-, fejl- og tomme tilstande
- Kontrollér
@Published-uddata og tilstandsovergange
Testbare ViewModels er gevinsten ved MVVM's adskillelse af ansvar.
Lær Swift med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 122
- Lektioner
- 409
Ofte stillede spørgsmål
Er lektionen “Testning af view models” gratis?
Ja — alle 3 lektioner i læringssporet Swift Academy, inklusive “Testning af view models”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Swift Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Testning af view models”?
Unit-test præsentationslogik isoleret. Du øver dig i Swift Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Swift Academy?
Der kræves ingen tidligere erfaring. Swift Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Testning af view models”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Swift Academy-lektion?
Ja. Alle Swift Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- MVVM-patternet
- Binding af view models til views
- Coordinator-patternet
- Testning af view models