Jetpack Compose Academy · Lekcja

Testowanie ViewModeli i przepływów

Testuj jednostkowo logikę za pomocą dyspozytorów testowych

Lekcja 4 z 413 kroki

Testowanie ViewModeli i przepływów to bezpłatna lekcja Jetpack Compose Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Jetpack Compose Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Jetpack Compose Academy zawiera 4 lekcji w sumie.

Testowanie logiki bez interfejsu

ViewModel przechowuje logikę ekranu, dlatego można testować ją bezpośrednio za pomocą zwykłego JUnit. Nie jest potrzebny emulator ani renderowanie, dzięki czemu takie testy są szybkie. ⚡

Przygotuj, wykonaj, sprawdź

Testy ViewModel stosują prosty schemat: należy utworzyć ViewModel, wywołać funkcję, a następnie sprawdzić nowy stan. Każdy test powinien skupiać się na jednym działaniu.

val vm = CounterViewModel()
vm.increment()
assertEquals(1, vm.count)

Wyzwanie związane z korutynami

Wiele elementów ViewModel uruchamia korutyny działające na Dispatchers.Main. W testach nie ma głównej pętli looper, dlatego trzeba użyć zamiast niej dyspozytora testowego.

StandardTestDispatcher

StandardTestDispatcher zapewnia pełną kontrolę nad czasem wykonywania korutyn. Zadania są kolejkowane i uruchamiane dopiero po przesunięciu wirtualnego zegara.

val dispatcher = StandardTestDispatcher()

Zastępowanie dyspozytora głównego

Przed każdym testem należy użyć Dispatchers.setMain, aby wstrzyknąć dyspozytora testowego, a następnie wywołać resetMain, by pozostawić globalny stan w czystości.

Dispatchers.setMain(dispatcher)

runTest

Ciała testów zawierające funkcje zawieszane należy opakować w runTest. Zapewnia on zakres korutyn z wirtualnym zegarem, dzięki czemu opóźnienia są rozwiązywane natychmiast, a nie po upływie rzeczywistych sekund.

@Test fun loads() = runTest {
    // suspend calls run here
}

Szybkie sprawdzenie

Państwa ViewModel uruchamia korutyny na głównym dyspozytorze. Co pozwala testowi jednostkowemu kontrolować ich wykonanie?

Przesuwanie zegara

W przypadku StandardTestDispatcher zakolejkowane korutyny czekają. Należy wywołać advanceUntilIdle wewnątrz runTest, aby uruchomić je wszystkie, a następnie sprawdzić końcowy stan.

advanceUntilIdle()
assertEquals(Loaded, vm.uiState.value)

Testowanie StateFlow

ViewModel często udostępnia StateFlow. Jego bieżąca migawka znajduje się w .value, dlatego można ją bezpośrednio odczytać i sprawdzić po przesunięciu zegara.

assertEquals(0, vm.count.value)

Zbieranie emisji Flow

Aby przechwycić sekwencję emisji, biblioteka Turbine ułatwia testowanie Flow za pomocą awaitItem, sprawdzając każdą wartość w chwili jej nadejścia.

vm.events.test {
    assertEquals(Saved, awaitItem())
}

Zastępowanie zależności atrapami

Należy wstrzyknąć atrapę repozytorium zwracającą przygotowane dane. Dzięki temu testy są szybkie i pozwalają symulować ścieżki sukcesu oraz błędu bez prawdziwej sieci.

val vm = NewsViewModel(FakeRepo())

Czyste kończenie testów

Podczas sprzątania po teście należy zawsze połączyć setMain z resetMain. Pozostawienie zainstalowanego dyspozytora testowego może wpłynąć na inne testy w zestawie i spowodować ich niepowodzenie.

@After fun tearDown() {
    Dispatchers.resetMain()
}

Podsumowanie: ViewModel i Flow

Logikę można testować bez interfejsu, zastępując dyspozytora dyspozytorem testowym, uruchamiając kod w runTest i sprawdzając wartości StateFlow. Szybkie, ukierunkowane i niezawodne testy. 🏁

Bezpłatny start

Ucz się Kotlin dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Testowanie ViewModeli i przepływów” jest bezpłatna?

Tak — pełny tekst „Testowanie ViewModeli i przepływów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Jetpack Compose Academy, przejdź na CoddyKit PRO. Kurs Jetpack Compose Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Testowanie ViewModeli i przepływów”?

Testuj jednostkowo logikę za pomocą dyspozytorów testowych Ćwiczysz Jetpack Compose Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Jetpack Compose Academy?

Nie wymagamy żadnego doświadczenia. Jetpack Compose Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Testowanie ViewModeli i przepływów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Jetpack Compose Academy?

Tak. Każda lekcja Jetpack Compose Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. createComposeRule i findery
  2. Asercje i wykonywanie akcji
  3. Semantyka i tagi testowe
  4. Testowanie ViewModeli i przepływów
← Powrót do Jetpack Compose Academy