как утверждать, что текст не содержит определенных символов в тестировании Android Jetpack?
Я пытаюсь написать несколько тестовых примеров для моих функций компоновки. У меня есть выделенное текстовое поле с максимальным значением 16 символов. Поэтому я хочу протестировать эту функцию. Вот тест:
@Test
fun checkMaxTaxCodeLength_16Character() {
val taxCode = composeRule.onNodeWithTag(testTag = AUTHENTICATION_SCREEN_TAX_CODE_EDIT_TEXT)
for (i in 'A'..'Z')
taxCode.performTextInput(i.toString())
taxCode.assertTextEquals("ABCDEFGHIJKLMNOP")
}
Но хотя я вижу, что ввод правильный, тест не проходит, и кажется, что assertTextEquals работает неправильно. Так:
- во-первых, что я делаю не так?
- Во-вторых, есть ли способ вместо проверки на равенство проверять, что текст не содержит определенных символов?
вот код текстового поля:
OutlinedTextField(
value = state.taxCode,
maxLines = 1,
onValueChange = { string ->
viewModel.onEvent(
AuthenticationEvent.TaxCodeChanged(string)
)
},
label = {
Text(text = stringResource(id = R.string.tax_code))
},
modifier = Modifier
.fillMaxWidth()
.testTag(TestingConstant.AUTHENTICATION_SCREEN_TAX_CODE_EDIT_TEXT)
)
Максимальная длина обрабатывается в модели представления. Если пользователь добавит больше символов, чем 16, модель представления не будет обновлять состояние и сохранит старое значение.
2 ответа
во-первых, что я делаю не так?
assertTextEquals()
принимает значение иEditableText
в вашем семантическом узле объединяет их, а затем проверяет значения, которые вы передаете. Порядок не имеет значения, просто убедитесь, что передано значениеText
как один из аргументов.
val mNode = composeTestRule.onNodeWithText("Email"))
mNode.performTextInput("test@mail.com")
mNode.assertTextEquals("Email", "test@mail.com")
Обратите внимание на текстEmail
метка для составного текстового поля.
Чтобы получить семантическую информацию о ваших узлах, вы можете
@Test
fun print_semantics_tree() {
composeTestRule.onRoot(useUnmergedTree = true).printToLog(TAG)
}
Для вы можете использовать любую строку. После запуска вышеуказанного теста вы можете выполнить поиск логарифма с указаннымTAG
. Вы должны увидеть что-то вроде
|-Node #3 at (l=155.0, t=105.0, r=925.0, b=259.0)px
| Focused = 'false'
| ImeAction = 'Default'
| EditableText = 'test@mail.com'
| TextSelectionRange = 'TextRange(0, 0)'
| Text = '[Email]'
| Actions = [RequestFocus, GetTextLayoutResult, SetText, SetSelection,
OnClick, OnLongClick, PasteText]
Обратите внимание, что вы также можете получить объект узла семантики с помощью операции индекса, а не перебирать все значения.
val value = fetchSemanticsNode().config[EditableText]
assertEquals("test@mail.com", value.toString())
Хорошо, тем не менее, проблема открыта, но я добился того, что хотел другим путем. Я использовал семантические узлы, чтобы получить то, что находится в тексте редактирования, и сравнил его с тем, что должно быть:
@Test
fun checkMaxTaxCodeLength_16Character() {
val taxCode = composeRule.onNodeWithTag(testTag = AUTHENTICATION_SCREEN_TAX_CODE_EDIT_TEXT)
for (i in 'A'..'Z')
taxCode.performTextInput(i.toString())
for ((key,value) in taxCode.fetchSemanticsNode().config)
if (key.name =="EditableText")
assertEquals("ABCDEFGHIJKLMNOP",value.toString())
}