Swift Academy · Oppitunti

View modelien testaaminen

Testaa esityslogiikkaa yksikkötesteillä erillään.

Oppitunti 4/413 vaihetta

View modelien testaaminen on ilmainen Swift Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Swift Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Miksi ViewModeleita testataan?

ViewModel sisältää esityslogiikan, joten se on arvokkain yksikkötestattava kerros. Koska sillä ei ole UIKit- tai SwiftUI-riippuvuutta, sitä voi testata erillään nopeasti ja deterministisesti.

Testattavuus suunnittelun lähtökohtana

Hyvin rakennettu ViewModel saa riippuvuutensa alustajansa kautta. Näin testit voivat korvata ne feikeillä.

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

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

Riippuvuuksien injektointi

Piilota konkreettiset riippuvuudet protokollan taakse. ViewModel riippuu abstraktiosta, joten testit voivat injektoida mockin.

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

Mockin kirjoittaminen

Mocki toteuttaa protokollan ja palauttaa ennalta määritettyä dataa. Sen avulla voit hallita tarkasti sitä, mitä ViewModel näkee.

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

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

Perusyksikkötesti

Kun mocki on injektoitu, varmistat, että ViewModel muuntaa datan oikein.

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

    await vm.load()

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

Tilasiirtymien testaaminen

ViewModelit paljastavat usein tilaenumin. Testaa jokainen haara tuottamalla syötteet, jotka johtavat siihen.

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

    await vm.load()

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

Virhepolkujen testaaminen

Aseta mocki heittämään virhe ja varmista, että ViewModel käsittelee virheet hallitusti ja tuo virhetilan näkyviin.

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)
}

Vuorovaikutusten varmistaminen

Joskus on tärkeää varmistaa, että riippuvuutta kutsuttiin, eikä vain tarkistaa tulosta. Mockin vakoilulippujen avulla voit varmistaa toiminnan.

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

@Published-tulosteen testaaminen

Voit tilata @Published-ominaisuutta Combinella, kerätä lähetetyt arvot ja varmistaa niiden järjestyksen.

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

await vm.load()

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

Testien pitäminen nopeina

Koska mockit palauttavat tulokset välittömästi eikä oikeaa verkkoa käytetä, ViewModel-testit suoritetaan millisekunneissa. Vältä oikeita ajastimia ja URLSessionia — injektoi feikit myös kelloille ja ajastimille.

Parhaat käytännöt

Tehokkaissa ViewModel-testeissä:

  • Injektoidaan kaikki riippuvuudet protokollien kautta
  • Testataan yksi toiminta kutakin testimetodia kohden
  • Katetaan onnistumis-, tyhjä- ja virhepolut
  • Varmistetaan ne julkaistut tulokset, joita näkymä lukee

Pikatesti

Testaa tietosi ViewModelien testaamisesta.

Kertaus

Opit testaamaan ViewModelit yksikkötesteillä erillään muusta sovelluksesta:

  • Injektoi riippuvuudet protokollien taakse
  • Käytä mockeja syötteiden hallintaan ja kutsujen tarkkailuun
  • Kat a onnistumis-, virhe- ja tyhjät tilat
  • Varmista @Published-tulosteet ja tilasiirtymät

Testattavat ViewModelit ovat MVVM:n vastuiden erottelun tärkein hyöty.

Aloita maksutta

Opi Swift tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
122
Oppitunnit
409

Usein kysytyt kysymykset

Onko oppitunti ”View modelien testaaminen” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Swift Academy-oppimispolun 3 oppituntia, myös oppitunnin “View modelien testaaminen”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Swift Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”View modelien testaaminen”?

Testaa esityslogiikkaa yksikkötesteillä erillään. Harjoittelet Swift Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Swift Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Swift Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”View modelien testaaminen”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Swift Academy-oppitunnilla?

Kyllä. Jokainen Swift Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. MVVM-kuvio
  2. View modelien sitominen näkymiin
  3. Coordinator-kuvio
  4. View modelien testaaminen
← Takaisin: Swift Academy