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
        )
    ) { ... }
}

我希望编写如下测试:verifyEnabledBackgroundColorverifyDisabledBakcgroundColor

我无法在撰写测试中找到任何直接可用的断言,当我尝试创建自己的断言时,我发现 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 }
}