【问题标题】:Android Jetpack compose how to test background colorAndroid Jetpack compose 如何测试背景颜色
【发布时间】:2022-06-15 17:53:17
【问题描述】:

我有一个设置背景颜色的组合,我想测试一下。

@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 级别,这对我的项目来说是不行的。

如何测试设置可组合的背景颜色?

【问题讨论】:

    标签: android android-jetpack-compose android-testing


    【解决方案1】:

    经过多次尝试和错误,我找到了一种方法。有一个扩展名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 }
    }
    

    【讨论】:

    • 伙计,它不起作用:)。它只返回颜色空间名称,这在技术上对于所有颜色都是相同的。用颜色测试它:)。测试过了,不行。
    • @Pietrek 谢谢你让我知道,去看看
    • 没问题,如果我找到解决方案,我会在这里发布答案。手指交叉:)
    【解决方案2】:

    根据 colorspace.name 验证可组合的颜色不起作用,因为返回的值只是颜色空间的名称。换句话说,无论实际颜色如何,测试都会通过。

    如果测试的目的是区分组合的实际颜色是否正确,例如在组合的颜色动态变化的情况下,我们需要使用方法 .readPixels 提供“ARGB 值打包到诠释。”

    示例用法:

    val array = IntArray(20)
    composeTestRule.onNodeWithTag(TestTags.CONTENT_TEXT_FIELD_TAG).captureToImage()
                .readPixels(array, startY = 500, startX = 200, width = 5, height = 4)
    array.forEach { it shouldNotBe Colors().Red.convert(ColorSpaces.Srgb).hashCode() }
    array.forEach { it shouldBe Colors().Pink.convert(ColorSpaces.Srgb).hashCode() }
    

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 2022-06-15
      • 2022-11-06
      • 2023-02-13
      • 2022-11-01
      • 2022-08-18
      • 2022-07-08
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多