android 使用assertTextEquals()测试Composable失败,并出现IllegalStateException

3xiyfsfu  于 2023-04-18  发布在  Android
关注(0)|答案(1)|浏览(111)

我正在测试一个简单的 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 了我的测试函数,但文本仍然失败。
请帮我解决这个问题。

kb5ga3dv

kb5ga3dv1#

Assert不能在主线程中运行。整个主线程都在setContent中。将其放在setContent的作用域之外,它应该可以工作:

composeTestRule.onNodeWithContentDescription("TextField")
                .performTextInput("Tonnie")

        composeTestRule.onNodeWithContentDescription("TextField")
                .assertTextEquals("Tonnie")

相关问题