как утверждать, что текст не содержит определенных символов в тестировании 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())
    }
Другие вопросы по тегам