Как ввести текст в Jetpack, составить TextField через тесты пользовательского интерфейса?

В Jetpack compose у меня есть TextField, и я пытаюсь написать тесты пользовательского интерфейса Espresso. Я не нашел, как ввести текст в текстовое поле, пожалуйста, какие-нибудь идеи?

        TextField(
            value = textState.value,
            modifier = Modifier.fillMaxWidth(),
            onValueChange = {
                textState.value = it
                apiServiceCall(textState.value.text)
            },
            keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences)
        )

@get:Rule
val composeTestRule = createAndroidComposeRule<MainActivity>()

@Test
fun enterTextAndMakeServiceCall() {
    ActivityScenario.launch(MainActivity::class.java)

    //TODO: Enter text inside the TextField
    composeTestRule.onNode(hasText(getString(R.string.result)))
}

person AndroidDev    schedule 17.03.2021    source источник


Ответы (1)


Сначала я устанавливаю модификатор testTag для составного объекта, который хочу протестировать:

const val MY_TEXTFIELD_TAG = "myTextFieldTag"

TextField(
    value = textState.value,
    modifier = Modifier.fillMaxWidth().testTag(MY_TEXTFIELD_TAG),
    onValueChange = {
        textState.value = it
    },
    keyboardOptions = KeyboardOptions(capitalization = KeyboardCapitalization.Sentences),
)

А затем из вашего теста вы можете установить и проверить значение следующим образом:

@Test
fun setAndCheckTheTextFieldValue() {
    ActivityScenario.launch(MainActivity::class.java)
    val resultText = "result"

    // Sets the TextField value
    composeTestRule.onNodeWithTag(MY_TEXTFIELD_TAG).performTextInput(resultText)

    // Asserts the TextField has the corresponding value
    composeTestRule.onNodeWithTag(MY_TEXTFIELD_TAG).assert(hasText(resultText))
}
person jeprubio    schedule 18.03.2021