Testowanie ViewModeli i przepływów
Testuj jednostkowo logikę za pomocą dyspozytorów testowych
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. 🏁
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
- createComposeRule i findery
- Asercje i wykonywanie akcji
- Semantyka i tagi testowe
- Testowanie ViewModeli i przepływów