我正在测试一个简单的 TextField 组合,我使用**onNodeWithContentDescription()
**来定位这个TextField,我已经在它的修饰符上应用了 semantics。
TextField(
modifier = Modifier
.fillMaxWidth()
.semantics { contentDescription = "TextField" },
value = text,
onValueChange = { onTextChange(it) },
这是我的测试函数:
@get:Rule
val composeTestRule = createComposeRule()
@Test
fun openSearchWidget_enterInputText_assertInputText() {
var text by mutableStateOf("")
composeTestRule.setContent {
SearchWidget(text = text, onTextChange = { text = it }))
composeTestRule.onNodeWithContentDescription("TextField")
.performTextInput("Tonnie")
composeTestRule.onNodeWithContentDescription("TextField")
.assertTextEquals("Tonnie")
}
}
测试失败,出现此错误。
java.lang.IllegalStateException:涉及同步的函数(Assert、动作、同步;e.g. assertIsSelected(),doClick(),runOnIdle())无法从主线程运行。您是否在runOnIdle {},runOnUiThread {}或setContent {}中嵌套了此类函数?在androidx.compose.ui.test.junit4.EspressoLink.runUntilIdle(EspressoLink.android.kt:73)在androidx.compose.ui.test.AndroidComposeUiTestEnvironment.waitForIdle(ComposeUiTest.android.kt:308)在androidx.compose.ui.test.AndroidComposeUiTestEnvironment.access$poseForIdle(ComposeUiTest.android.kt:217)
我已经用**setContent{}
** Package 了我的测试函数,但文本仍然失败。
请帮我解决这个问题。
1条答案
按热度按时间kb5ga3dv1#
Assert不能在主线程中运行。整个主线程都在setContent中。将其放在setContent的作用域之外,它应该可以工作: