Метод waitForIdle
Метод waitForIdle у
ComposeContentTestRule
блокирует тест, пока очередь recompositions
и анимаций не опустеет.
Вызывают перед
assertIsDisplayed,
если UI меняется асинхронно.
Параметров у метода нет.
Синтаксис
composeTestRule.waitForIdle()
Пример
Давайте подождём idle перед проверкой текста:
import androidx.compose.material3.Text
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
import org.junit.Rule
import org.junit.Test
class WaitForIdleTest {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun waitsThenAsserts() {
composeTestRule.setContent {
Text(text = "abcde")
}
composeTestRule.waitForIdle()
composeTestRule.onNodeWithText("abcde").assertIsDisplayed()
}
}
Тест проходит: после waitForIdle узел
с "abcde" стабильно виден.
Пример
Давайте сменить текст в состоянии и снова дождаться idle:
import androidx.compose.material3.Text
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.test.assertIsDisplayed
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithText
import org.junit.Rule
import org.junit.Test
class IdleAfterEffectTest {
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun showsTextAfterEffect() {
composeTestRule.setContent {
val label = remember { mutableStateOf("abcde") }
LaunchedEffect(Unit) {
label.value = "12345"
}
Text(text = label.value)
}
composeTestRule.waitForIdle()
composeTestRule.onNodeWithText("12345").assertIsDisplayed()
}
}
Тест проходит: LaunchedEffect успел
подставить "12345" до assert.
Смотрите также
-
метод
setContent,
перед waitForIdle после setContent -
метод
assertIsDisplayed,
часто следом за waitForIdle -
класс
ComposeContentTestRule,
где объявлен waitForIdle -
функция
createComposeRule,
создаёт правило с waitForIdle