Android Jetpack compose 如何测试背景颜色
Android Jetpack compose how to test background color
我有一个设置背景颜色的可组合项,我想测试一下。
@Composable
fun MyComposableButton(
enabledColor: Color,
disableColor: Color,
isEnabled: Boolean = true,
) {
val buttonBackgroundColor = if (enabled) enabledColor else disableColor
Button(
...
enabled = enabled,
colors = ButtonDefaults.textButtonColors(
backgroundColor = buttonBackgroundColor
)
) { ... }
}
我希望编写如下测试:verifyEnabledBackgroundColor
和 verifyDisabledBakcgroundColor
。
我无法在撰写测试中找到任何直接可用的断言,当我尝试创建自己的断言时,我发现 SemanticMatcther
使用 SemanticNode
,但构造函数是内部的最新所以不行。
我尝试 mock
Color
但我做不到,根据 this answer 需要高 API 级别,这对我的项目来说是不行的.
如何测试可组合项的背景颜色设置?
经过反复试验,我找到了一种方法。有一个颜色为 space 的扩展 captureImage
。这样,我们就可以找到颜色名称并进行相等的断言。
虽然它有一些限制:它是节点下面的表面,因此多个节点或梯度可能不起作用。
fun SemanticsNodeInteraction.assertBackgroundColor(expectedBackground: Color) {
val capturedName = captureToImage().colorSpace.name
assertEquals(expectedBackground.colorSpace.name, capturedName)
}
我为了复用做了一个扩展,例如:
composeTestRule.setContent {
...
}
composeTestRule.onNodeWithText(someText).assertBackgroundColor(YourColor)
注意,这可能有效,因为在测试中我们确保通过我们的主题:
composeTestRule.setContent {
OurSuperCoolTheme { //your compose }
}
我有一个设置背景颜色的可组合项,我想测试一下。
@Composable
fun MyComposableButton(
enabledColor: Color,
disableColor: Color,
isEnabled: Boolean = true,
) {
val buttonBackgroundColor = if (enabled) enabledColor else disableColor
Button(
...
enabled = enabled,
colors = ButtonDefaults.textButtonColors(
backgroundColor = buttonBackgroundColor
)
) { ... }
}
我希望编写如下测试:verifyEnabledBackgroundColor
和 verifyDisabledBakcgroundColor
。
我无法在撰写测试中找到任何直接可用的断言,当我尝试创建自己的断言时,我发现 SemanticMatcther
使用 SemanticNode
,但构造函数是内部的最新所以不行。
我尝试 mock
Color
但我做不到,根据 this answer 需要高 API 级别,这对我的项目来说是不行的.
如何测试可组合项的背景颜色设置?
经过反复试验,我找到了一种方法。有一个颜色为 space 的扩展 captureImage
。这样,我们就可以找到颜色名称并进行相等的断言。
虽然它有一些限制:它是节点下面的表面,因此多个节点或梯度可能不起作用。
fun SemanticsNodeInteraction.assertBackgroundColor(expectedBackground: Color) {
val capturedName = captureToImage().colorSpace.name
assertEquals(expectedBackground.colorSpace.name, capturedName)
}
我为了复用做了一个扩展,例如:
composeTestRule.setContent {
...
}
composeTestRule.onNodeWithText(someText).assertBackgroundColor(YourColor)
注意,这可能有效,因为在测试中我们确保通过我们的主题:
composeTestRule.setContent {
OurSuperCoolTheme { //your compose }
}