如何断言 android jetpack 撰写测试中的文本不包含特定字符?

Moh*_*mad 4 testing android android-jetpack-compose android-jetpack-compose-testing

我正在尝试为我的撰写功能编写一些测试用例。我有一个轮廓文本字段,最大值为 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")
    }
Run Code Online (Sandbox Code Playgroud)

但是,虽然我可以看到输入是正确的,但测试失败,并且似乎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)
                )
Run Code Online (Sandbox Code Playgroud)

最大长度在视图模型中处理。如果用户添加的字符超过 16 个,视图模型将不会更新状态并保留旧值。

Oti*_*wel 5

首先,我做错了什么?

assertTextEquals()Text获取语​​义节点中和的值EditableText,将它们组合起来,然后检查您传入的值。顺序并不重要,只需确保将 的值作为Text参数之一传入即可。

     val mNode = composeTestRule.onNodeWithText("Email")) 
     mNode.performTextInput("test@mail.com")
     mNode.assertTextEquals("Email", "test@mail.com")
Run Code Online (Sandbox Code Playgroud)

请注意,文本Email是文本字段可组合项的标签。

要获取有关节点的语义信息,您可以

     val mNode = composeTestRule.onNodeWithText("Email")) 
     mNode.performTextInput("test@mail.com")
     mNode.assertTextEquals("Email", "test@mail.com")
Run Code Online (Sandbox Code Playgroud)

对于 ,TAG您可以使用任何字符串。运行上述测试后,您可以使用指定的 .logcat 搜索TAG。你应该看到类似的东西

    @Test
    fun print_semantics_tree() {
        composeTestRule.onRoot(useUnmergedTree = true).printToLog(TAG)
    }
Run Code Online (Sandbox Code Playgroud)

请注意,您还可以通过索引操作获取语义节点对象,而不是迭代所有值。

    |-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]
Run Code Online (Sandbox Code Playgroud)