如何在 android Jetpack Compose 测试中断言文本不包含特定字符?

how to assert that text not contains specific characters in 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")
    }

但是虽然我可以看到输入是正确的,但是测试失败了,而且 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 个,视图模型将不会更新状态并保留旧值。

好的,问题仍然存在,但我用另一种方式实现了我想要的。我使用语义节点来获取编辑文本中的内容并将其与应有的内容进行比较:

    @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())
    }