撰写 UI 测试 - 如何声明文本颜色?
Compose UI testing - How do I assert a text color?
我正在尝试测试 Text
我可以在我的组件上以不同的颜色打印它,所以在我的测试中我正在验证它是否获得了预期的颜色。我一直在寻找一种 return 颜色的方法,但我没有找到。
从现在开始,我断言文本是正确的并且可见性是正确的,但是当我试图找到获得颜色的方法时,我变得太深了,我正在寻找一个更简单的解决方案。
composeTestRule.onNode(hasTestTag("testTagForButton"), true)
.assertExists()
.assertTextEquals("Testing")
我检查过我是否可以做类似 .fetchSemanticsNode().layoutInfo.getModifierInfo()
的事情来进入 Modifier
,也许从那里我可以获得颜色,但也许太多了。我还发现这个 .captureToImage()
也许我可以在上面涂上颜色,但由于我必须放置像素,所以我决定不这样做。
有什么简单的方法可以做到吗?
我绝不是撰写专家,但只需查看撰写源代码,您就可以利用他们的 GetTextLayoutResult 可访问性语义操作。这将包含用于在 canvas.
上呈现 Text
的所有属性
为了方便起见,我提供了一些快速而肮脏的扩展功能:
fun SemanticsNodeInteraction.assertTextColor(
color: Color
): SemanticsNodeInteraction = assert(isOfColor(color))
private fun isOfColor(color: Color): SemanticsMatcher = SemanticsMatcher(
"${SemanticsProperties.Text.name} is of color '$color'"
) {
val textLayoutResults = mutableListOf<TextLayoutResult>()
it.config.getOrNull(SemanticsActions.GetTextLayoutResult)
?.action
?.invoke(textLayoutResults)
return@SemanticsMatcher if (textLayoutResults.isEmpty()) {
false
} else {
textLayoutResults.first().layoutInput.style.color == color
}
}
然后可以这样使用:
composeTestRule.onNode(hasTestTag("testTagForButton"), true)
.assertExists()
.assertTextEquals("Testing")
.assertTextColor(Color.Black)
我正在尝试测试 Text
我可以在我的组件上以不同的颜色打印它,所以在我的测试中我正在验证它是否获得了预期的颜色。我一直在寻找一种 return 颜色的方法,但我没有找到。
从现在开始,我断言文本是正确的并且可见性是正确的,但是当我试图找到获得颜色的方法时,我变得太深了,我正在寻找一个更简单的解决方案。
composeTestRule.onNode(hasTestTag("testTagForButton"), true)
.assertExists()
.assertTextEquals("Testing")
我检查过我是否可以做类似 .fetchSemanticsNode().layoutInfo.getModifierInfo()
的事情来进入 Modifier
,也许从那里我可以获得颜色,但也许太多了。我还发现这个 .captureToImage()
也许我可以在上面涂上颜色,但由于我必须放置像素,所以我决定不这样做。
有什么简单的方法可以做到吗?
我绝不是撰写专家,但只需查看撰写源代码,您就可以利用他们的 GetTextLayoutResult 可访问性语义操作。这将包含用于在 canvas.
上呈现Text
的所有属性
为了方便起见,我提供了一些快速而肮脏的扩展功能:
fun SemanticsNodeInteraction.assertTextColor(
color: Color
): SemanticsNodeInteraction = assert(isOfColor(color))
private fun isOfColor(color: Color): SemanticsMatcher = SemanticsMatcher(
"${SemanticsProperties.Text.name} is of color '$color'"
) {
val textLayoutResults = mutableListOf<TextLayoutResult>()
it.config.getOrNull(SemanticsActions.GetTextLayoutResult)
?.action
?.invoke(textLayoutResults)
return@SemanticsMatcher if (textLayoutResults.isEmpty()) {
false
} else {
textLayoutResults.first().layoutInput.style.color == color
}
}
然后可以这样使用:
composeTestRule.onNode(hasTestTag("testTagForButton"), true)
.assertExists()
.assertTextEquals("Testing")
.assertTextColor(Color.Black)